在 rspec 中更改关联对象的正确方法
the right way to change the associated object in 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
我做错了什么?以及如何解决?
当您说 user.participations.select(:prize)
时,您正在对数据库进行查询以获取用户参与的奖品列中的值。但是当您说 before {participation.prize = 100}
时,您只是在参与对象上设置奖品 属性 。尝试在 select 行之前保存参与:
participation.prize # => 100
participation.save
user.participatons.select(:prize) # => nil
另一个可能的问题是 user.participations
已被之前的通话记录下来。确保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
这样,价格会在您创建模型时设置。遵循这种模式通常意味着 运行 更少地遇到这个问题。
我最近开始用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
我做错了什么?以及如何解决?
当您说 user.participations.select(:prize)
时,您正在对数据库进行查询以获取用户参与的奖品列中的值。但是当您说 before {participation.prize = 100}
时,您只是在参与对象上设置奖品 属性 。尝试在 select 行之前保存参与:
participation.prize # => 100
participation.save
user.participatons.select(:prize) # => nil
另一个可能的问题是 user.participations
已被之前的通话记录下来。确保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
这样,价格会在您创建模型时设置。遵循这种模式通常意味着 运行 更少地遇到这个问题。