2016-05-03 8 views
3

Ich verwende RSpec mit FactoryGirl innerhalb einer Ruby-on-Rails-Umgebung zum Testen.RSpec mit FactoryGirl expliziten Betreff

ich meine Fabriken angeben möchten, wie folgt:

factory :user do 
    role # stub 

    factory :resident do 
     association :role, factory: :resident_role 
    end 

    factory :admin do 
     association :role, factory: :admin_role 
    end 
    end 

Und ich möchte so etwas wie dies in meinem spec tun:

require 'rails_helper' 

RSpec.describe User, type: :model do 
    context "all users" do 
    # describe a user 
    # subject { build(:user) } 
    # it { is_expected.to be_something_or_do_something } 
    end 

    context "residents" do 
    # describe a resident 
    # subject { build(:resident) } 
    # it { is_expected.to be_something_or_do_something } 
    end 

    context "admins" do 
    # describe a admin 
    # subject { build(:admin) } 
    # it { is_expected.to be_something_or_do_something } 
    end 

end 

dies ausdrücklich getan werden kann, durch die Einstellung subject ? Wenn ich das mache, bekomme ich doppelte Rollenfehler.

Wenn jemand einen Rat oder einen Vorschlag hat, würde es sehr geschätzt werden!

Antwort

3

Dies führt jedoch dazu, dass user_spec.rb die Factory user verwendet.

Nein, tut es nicht. Angenommen, Sie haben FactoryGirl korrekt konfiguriert, kann RSpec in jeder Testdatei die Fabrik verwenden, die Sie "on demand" wünschen. Configuration-weise, in rails_helper.rb werfen diese in:

RSpec.configure do |config| 
    # ... 
    config.include FactoryGirl::Syntax::Methods 
    # ... 
end 

Dann in der Spec-Datei:

require 'rails_helper' 

RSpec.describe User, type: :model do 
    context "all users" do 
    let(:user) { create(:user) } 

    it 'is a user' do 
     # Here `user` is going to be a user factory 
     expect(user.unit).not_to be_present 
    end 

    end 

    context "residents" do 
    let(:user) { create(:resident) } 

    it 'is a resident' do 
     # Here `user` is going to be a resident factory 
     expect(user.unit).to be_present 
    end 
    end 

    context "admins" do 
    let(:user) { create(:admin) } 

    it 'is an admin' do 
     # Here `user` is going to be an admin factory 
     expect(user.role).to be('admin_role') 
    end 
    end 

end 

Kurz gesagt, Sie create(<factory_name>) auf jede Fabrik Definition verwenden können, die in einem dieser Wege besteht :

test/factories.rb 
spec/factories.rb 
test/factories/*.rb 
spec/factories/*.rb 

Beachten Sie, dass, wenn Sie nicht die config.include FactoryGirl::Syntax::Methods in Ihrem RSpec.configure platziert haben, können Sie immer noch jede Fabrik schaffen, durch doin g FactoryGirl.create(<factory_name>) anstelle von create(<factory_name>).

+0

Hmm war zu verwenden, benötigt. Bist du sicher? Ich habe gerade eine 'rate subject.inspect' auf einer ähnlichen Spezifikation von mir laufen lassen, mit einer Fabrik namens Model und Spec, und ich beobachte kein solches Verhalten. Mein implizites "Subjekt" ist ein ' .new' (Standardverhalten von RSpec), kein' FactoryGirl.build (: model_class) '. Was beobachtest du an deinem Ende? – AmitA

+0

Sie haben recht, es ist eine leere Modellinstanz! Danke, dass du das geklärt hast. – fbelanger

0

Ich glaube nicht, dass Sie sie vom automatischen Laden abhalten möchten, und ich bin mir nicht sicher, was Ihr Anwendungsfall ist, damit sie nicht geladen werden?

RSpec automagically fetches the factory for a spec Rspec lädt alle Fabriken in den Speicher, wenn Ihre Spezifikation Helfer lädt glaube ich. Da Ihre Factory diese Daten nur einmal in den Arbeitsspeicher lädt, bevor Ihre Tests ausgeführt werden, wird nichts aufgerufen, keine Objekte werden erstellt oder erstellt. Sie sind nur bereit, in Ihren Tests zu verwenden.

Erhalten Sie einen spezifischen Fehler oder gibt es einen Fall, den ich nicht sehe, dass Sie brauchen?