2016-05-31 2 views
0
에 연결하여 만든 인스턴스를 생성

는 두 가지 모델을 고려하십시오. 그럼 난 내 사양에 두 개의 공장을 정의 :FactoryGirl 어떻게 콜백

factory :user do 
end 

factory book do 
    user 
end 

여기에 질문, 내가 Book에 대한 테스트를 쓰고 있어요 때 사용할 때, 나는 기록 book1Book 위해 (현실을 부르 자)를 생성하고 싶습니다이야을 FactoryGirl.create(:book). Book의 인스턴스를 만든 다음 user으로 정의 된 연결을 만들려고합니다. 사용자를 생성 한 후 after_create이 트리거되며 user에 대해 book2이 생성됩니다. 그런 다음 book1user으로 바인딩하려고 시도하며 고유성 연결에 의해 차단됩니다.

이제 book = FactoryGirl.create(:user).book을 사용하고 있습니다. 이것이 최선의 방법인가요? 나는 그것이 매우 직관적 인 노트라고 생각한다. 나는 Book을 테스트하고있다. 나는 그것이 가장 좋을 것이라고 생각한다. book = FactoryGirl.create(:book)

고마워.

답변

1

나는 이것을 위해 trait을 사용할 수 있다고 생각합니다. 다음은 예입니다

공장

factory :user do 
    # Your config here 

    # Use trait 
    trait :without_book do 
    after(:build) do |user| 
     allow(user).to receive(:create_book).and_return true 
    end 
    end 

    trait :with_book do 
    allow(user).to receive(:create_book).and_call_original 
    end 

    transient do 
    # Use this by default but don't use this line also works 
    # because we create book in the normal behavior 
    with_book 
    end 
end 

는 당신이 보는대로, 내가 allow(user).to receive(:create_book).and_return true에서 스텁 방법을 사용

context 'test user without book' do 
    let(:user) { FactoryGirl.create(:user, :without_book) 

    it 'blah blah' do 
    end 
end 

context 'test user with book' do 
    let(:user) { FactoryGirl.create(:user, :with_book) 
    # Or simply use this, because :with_book is default 
    # let(:user) { FactoryGirl.create(:user) 

    it 'blah blah' do 
    end 
end 

Btw는 사양, 기본적으로,이 유틸리티 방법은에서 온다 rspec-mock이며 공장에서 사용할 수 있도록하려면이 구성이 필요합니다.

사양/rails_helper.rb

FactoryGirl::SyntaxRunner.class_eval do 
    include RSpec::Mocks::ExampleMethods 
end 

이상적으로, 당신은 create 또는 not create 사용자에 대한 trait를 사용하여 책, 시나리오를 시뮬레이션하기 쉬울 것입니다 처리 할 수 ​​있습니다!

+0

위대한 아이디어. 하지만 나는 (NoMethodError)'에 대해'undefined method'and_return '을 가지고 샘플을 시험해 본다. 왜 그런지 모르겠다. 하지만 나는'after (: build) {| user | – larryzhao

+0

rails_helper.rb에'include RSpec :: Mocks :: ExampleMethods'를 포함 하시겠습니까? –

+0

예, 미안 해요. 처음에는 그걸 놓쳤습니다. 나는 단지'rails_helper.rb'에'RSpec :: Mocks :: ExmpleMethods'를 포함 시키려하고 있습니다. 나는 여전히 NoMethodError : #FactoryGirl :: SyntaxRunner : 0x007fa33a963e00>에 대해 정의되지 않은 메소드'allow '를 얻는다. – larryzhao