【问题标题】:the right way to change the associated object in rspec在 rspec 中更改关联对象的正确方法
【发布时间】:2017-07-25 13:21:02
【问题描述】:

我最近开始用 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

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

【问题讨论】:

    标签: ruby-on-rails ruby rspec factory-bot let


    【解决方案1】:

    当您说user.participations.select(:prize) 时,您正在查询数据库以获取用户参与的奖品列中的值。但是当您说before {participation.prize = 100} 时,您只是在参与对象上设置奖品属性。尝试在选择行之前保存参与:

    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
    

    这样,价格在您创建模型时设置。遵循这种模式通常意味着更少遇到这个问题。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      相关资源
      最近更新 更多