2011-12-14 17 views
40

So Rails 3.1 è dotato di un generatore poco conosciuto "rails g plugin new", che offre uno scheletro adatto per un plugin gemma rails. [Http://guides.rubyonrails.org/plugins.html#or-generate-a-gemified-plugin]Rails 3.1 plugin gem, fittizio test app, rspec

Una delle cose utili che fa, è impostare le cose convenientemente per il test con Test :: Unit. Offre un'app di base fittizia per Rails che i test possono eseguire nel contesto di, per testare il comportamento del motore che funziona solo nella copia di un'app Rails. (lo inserisce in ./test/dummy). Ma i tuoi test sono ancora in my_gem/test, i test non si trovano nell'app fittizia. E my_gem/test/test_helper.rb è lì, scritto in modo tale che i test vengano eseguiti nel contesto dell'applicazione fittizia, avviata su ../dummy/config/environment.

Descrivo questo perché penso che molte persone non sappiano di questo nuovo generatore, il che mette le cose così bene.

Ma la mia domanda è, qualcuno ha capito come farlo con rspec invece? Ho provato a seguire gli stessi principi del fai-da-te per impostare le cose in questo modo per rspec in una gemma di plugin per rotaie, ma sto correndo in vari roadblocks confusi, e spero che qualcun altro l'abbia già capito (o sarebbe interessato a capirlo fuori per il resto di noi, heh).

risposta

93

Creare il plugin senza test-unit e specificare il percorso per l'applicazione dummy:

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

Aggiungere RSpec-rails come una dipendenza di sviluppo per il file gemspec (foobar.gemspec):

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

Esegui bundle install

Creare un collegamento simbolico dall'app fittizio alla directory delle specifiche del plug-in ed eseguire il generatore di installazione di Rspec:

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

Ora modificare spec/spec_helper.rb (o spec/rails_helper.rb a rotaie 4+, non è sicuro su versioni precedenti) cambiare questa linea (linea 3):

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

A tal:

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

Ora puoi eseguire Rspec dalla radice del tuo plugin e prenderà anche le specifiche dall'applicazione dummy.

bundle exec rspec spec 

Ho scritto di questo in modo più dettagliato, che mostra come anche istituito capibara, spork e la guardia in un rotaie plugin con un'applicazione fittizia:

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

+5

Per me, la riga: 'richiede File.expand_path (" ../../ config/environment ", __FILE __)' si trovava a 'spec/rails_helper.rb' invece di 'spec/spec_helper.rb'. Questo è dovuto a un cambiamento in Rspec? – J3RN

+0

Se manterrai la cartella fittizia all'interno di spec/allora rspec troverà i tuoi file spec due volte. La prima volta per gemma, la seconda volta per l'app per rails, dato che il pattering corrisponderà a tutti i file spec, per quanto riguarda se sono sotto symlink o meno. [--exclude-pattern] (https://relishapp.com/rspec/rspec-core/v/3-3/docs/configuration/exclude-pattern) sembra funzionare solo insieme a --pattern. 'config.pattern << ',! Spec/dummy'' e allo stesso modo sembra non funzionare L'unica soluzione che sembra risolvere questo caso è di avere una cartella fittizia al di fuori della cartella spec – Max

+0

Il link al tumblr l'articolo è in realtà rotto ... @ Nathan-Amick l'hai caricato da qualche altra parte? – opsidao

20

Basta eseguire rails plugin new <gemname> e quindi aggiungere rspec come development_dependency al file gemspec e installarlo rspec --init.

Ora spostare sottocartella fittizio test-spec e aggiungere questi per 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! 

come sono in test_helper!

+1

+1 per --init rspec – fotanus

+3

Questo ha funzionato molto bene per me, molto più semplice dell'altra risposta –

Problemi correlati