2014-12-05 20 views
0

这里是我的代码片段:FactoryGirl集合不会结转

context "(3) Integration" do 

    let(:ad) { create(:ad) } 
    let(:property) { create(:property, owner_id: 1) } 
    let(:visitor_session) { create(:visitor_session, property_id: property.id) } 
    let(:impression) { create(:impression, ad_id: ad.id, visitor_session_id: visitor_session.id) } 

    # before(:each) do 
    # DatabaseCleaner.clean_with(:truncation) 
    # end 

    describe "(a) An ad can check it's impressions" do 
     it do 
     expect(ad.impressions).to include impression 
     end 
    end 

    describe "(b) An ad can check the total impression count" do 
     it do 
     expect(ad.impressions.count).to eq 1; 
    end 
    end 
end 

第二次测试失败,当它真的应该传球,而我很大吃一惊。如果我在第一次测试的中间通行binding.pry,输出为ad.impressions返回CollectionProxy:

#<ActiveRecord::Associations::CollectionProxy [#<Impression id: 1, start_at: "2014-12-05 17:17:40", duration: 10, is_valid: true, ad_id: 1, visitor_session_id: 1, created_at: "2014-12-05 17:17:49", updated_at: "2014-12-05 17:17:49">]> 

调用此数,在撬控制台,返回1

当值我得到第二个测试,ad似乎是在第一次测试相同的对象,除了现在它的印象CollectionProxy是一个空的数组。

我怀疑这可能是一个数据库清理问题,这就是为什么我评论它,但它似乎没有任何影响。这里是我的spec_helper对于那些需要更多的细节:

require 'factory_girl' 
require 'database_cleaner' 
require 'devise' 

RSpec.configure do |config| 

    config.include Devise::TestHelpers, type: :controller 
    config.include FactoryGirl::Syntax::Methods 

    config.before(:suite) do 
    DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
    DatabaseCleaner.strategy = :transaction 
    end 

    config.before(:each, :js => true) do 
    DatabaseCleaner.strategy = :truncation 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 
    config.color = true; 

end 

为什么我收集的不是坚持到第二个测试?

回答

2

第一次测试通过的唯一原因是您直接在其中调用impression,这会导致评估let(:impression)块 - 这会在第一次调用时创建展示记录。

由于第二次测试根本不会调用impression,该记录永远不会被创建。

要修复它使用let!将测试代码本身之前评估块:

let!(:impression) { create(:impression, ad_id: ad.id, visitor_session_id: visitor_session.id) } 

let and let!文档获取更多信息。