2017-03-05 59 views
3

相关对象的正确方式最近,我开始使用RSpec进行测试,所以我能强烈地是错了,纠正我,如果有更好的办法改变rspec的

我创建了两个相关的模型

let(:user) {FactoryGirl.create :user} 
let!(:participation) {FactoryGirl.create :participation, user: user} 

和之前测试的一个变化相关的对象

context "when" do 
    before {participation.prize = 100} 
    it "" do 
    binding.pry 
    end 
end 

但是这里面的一个它

participation.prize => 100 
user.participatons.select(:prize) => nil 

我在做什么错?以及如何解决它?

回答

1

当你说user.participations.select(:prize),你正在做一个查询数据库获取用户的参股奖列的值。但是当您说before {participation.prize = 100}时,您只会在参与对象上设置奖品属性。尽量选择线之前保存的参与:

participation.prize # => 100 
participation.save 
user.participatons.select(:prize) # => nil 

另一个可能的问题是,user.participations已经由先前调用memoized。确保user.participations.first == participation。如果没有,请检查

1)puts participation.user_id

2)puts user.participations, user.reload.participations


最后,设置测试的更好的方法,让你碰上这个问题往往是少的东西沿着线:

# let(:price) { 0 } # default price. Optional so that tests won't throw errors if you forget to set it in a context/describe block. 
let(:user) {FactoryGirl.create :user} 
let!(:participation) {FactoryGirl.create :participation, user: user, price: price} 

# ... 

context "when ..." do 
    let(:price) { 100 } 
    it "" do 
    binding.pry 
    end 
end 

这样,当你创建模型价格定。遵循这种模式通常意味着少跑这个问题。