2011-12-14 8 views
40

Rails 3.1 zawiera mało znany poręczny generator "rails g plugin new", który daje szkielet odpowiedni do wtyczki gem gem. [http://guides.rubyonrails.org/plugins.html#or-generate--gemified-plugin]Klejnot pluginów Rails 3.1, pozorowana aplikacja testowa, rspec

Jedną z przydatnych rzeczy, które to robi, jest ustawienie rzeczy wygodnie do testowania z Test :: Unit. Daje ci to podstawową fikcyjną aplikację Railsową, którą twoje testy mogą uruchamiać w kontekście, aby przetestować zachowanie "silnika", które działa tylko w kopii aplikacji Rails. (umieszcza to w ./test/dummy). Ale twoje testy są nadal w my_gem/test, testy nie "żyją w fałszywej aplikacji. I tam znajduje się moja_gem/test/test_helper.rb, napisana w taki sposób, że testy będą uruchamiane w kontekście fałszywej aplikacji, uruchamianej na stronie ../dummy/config/environment.

Opisuję to, ponieważ uważam, że wiele osób nie wie o tym nowym generatorze, który tak ładnie ustawia rzeczy.

Ale moje pytanie brzmi, czy ktoś wymyślił, jak to zrobić z rspec zamiast? Próbowałem podążać za tymi samymi zasadami, które przydałyby się do rspec w klejnocie dodatku do railsów, ale wpadam w różne mylące blokady dróg i mam nadzieję, że ktoś inny już to odkrył (lub byłby zainteresowany dla reszty z nas, heh).

Odpowiedz

93

Tworzenie wtyczki bez badanej jednostce oraz określić ścieżkę do manekina aplikacji:

rails plugin new foobar --skip-test-unit --dummy-path=spec/dummy 

Dodaj rspec barierkami jako zależność rozwoju do pliku gemspec (foobar.gemspec):

Gem::Specification.new do |s| 
    . 
    . 
    . 
    s.add_development_dependency "rspec-rails" 
end 

Uruchom bundle install

Utwórz dowiązanie symboliczne z fikcyjnej aplikacji do katalogu specyfikacji wtyczki i uruchom generator instalacji Rspec:

cd spec/dummy 
ln -s ../../spec 
rails generate rspec:install 
cd - 

Teraz edytować spec/spec_helper.rb (lub spec/rails_helper.rb w szynach 4+, nie wiedząc o starszych wersjach) zmienia tę linię (linia 3):

require File.expand_path("../../config/environment", __FILE__) 

do tego:

require File.expand_path("../dummy/config/environment", __FILE__) 

teraz możesz uruchomić Rspec z katalogu głównego wtyczki, a także pobrać specyfikacje z aplikacji fikcyjnej.

bundle exec rspec spec 

pisałem o tym bardziej szczegółowo, pokazując, jak również skonfigurować kapibary, Spork i straż w ciągu szyn plugin z manekina aplikacji:

https://web.archive.org/web/20130125091106/http://namick.tumblr.com/post/17663752365/how-to-create-a-gemified-plugin-with-rails-3-2-rspec

+5

Dla mnie, linia: 'wymagają File.expand_path (" ../../ config/environment ", __FILE __)' został zlokalizowany na 'spec/rails_helper.rb' zamiast 'spec/spec_helper.rb'. Czy to ze względu na zmianę w Rspec? – J3RN

+0

Jeśli będziesz przechowywać fikcyjny folder wewnątrz spec/wtedy rspec odnajdzie twoje pliki spec dwa razy. Pierwszy raz dla klejnotów, drugi raz dla aplikacji szyn, ponieważ patter będzie pasował do wszystkich plików spec, jeśli są pod dowiązaniem symbolicznym, czy nie. [--exclude-pattern] (https://relishapp.com/rspec/rspec-core/v/3-3/docs/configuration/exclude-pattern) wydaje się działać tylko razem z --pattern. 'config.pattern << ',! Spec/dummy'' i podobnie nie działa albo Jedynym rozwiązaniem, które wydaje się naprawiać ten przypadek, jest posiadanie fikcyjnego folderu poza folderem specyfikacji – Max

+0

Link do tumblr artykuł jest w rzeczywistości uszkodzony ... @ nathan-amick przesłałeś go gdzieś indziej? – opsidao

20

Po prostu uruchom , a następnie dodaj rspec jako development_dependency do pliku gemspec i zainstaluj go rspec --init.

teraz przenieść folder, atrapę sub z test do spec i dodać je do spec_helper:

ENV["RAILS_ENV"] = "test" 

require File.expand_path("../dummy/config/environment.rb", __FILE__) 
require "rails/test_help" 
require '<gemname>' 

Rails.backtrace_cleaner.remove_silencers! 

ponieważ są one w test_helper!

+1

+1 dla rspec --init – fotanus

+3

To działało bardzo dobrze dla mnie, znacznie prostsze niż druga odpowiedź –