Ruby on rails 在rspec中更改关联对象的正确方法

Ruby on rails 在rspec中更改关联对象的正确方法,ruby-on-rails,ruby,rspec,factory-bot,let,Ruby On Rails,Ruby,Rspec,Factory Bot,Let,我最近开始使用rspec进行测试,所以我可能会大错特错,如果有更好的方法,请纠正我 我创建了两个相关的模型 let(:user) {FactoryGirl.create :user} let!(:participation) {FactoryGirl.create :participation, user: user} 在其中一个测试更改一个相关对象之前 context "when" do before {participation.prize = 100} it "" do

我最近开始使用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)
时,您正在对数据库进行查询,以获取用户的participations的prize列中的值。但是当您在{participation.prize=100}之前说
您只是在参与对象上设置了prize属性。尝试在选择行之前保存参与:

participation.prize # => 100
participation.save
user.participatons.select(:prize) # => nil
另一个可能的问题是,
user.participations
已被上一次呼叫记录。确保
user.participations.first==参与
。如果没有,请检查

1)
放置参与。用户id

2)
放置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
这样,在创建模型时就可以设置价格。遵循这种模式通常意味着更少地遇到这个问题