rails rspec测试模型上的更新属性

时间:2016-07-02 22:06:01

标签: ruby-on-rails ruby rspec

我有一个名为Reminder的非常简单的模型,其布尔属性为verified,我想测试我的方法update_verified,它只是将属性verified设置为{{ 1}}。我使用的是rspec和工厂女孩。

true

出于某种原因,当我运行测试时,属性# reminder.rb def update_verified self.update(verified: true) end # reminder_spec.rb describe "#update_verified" do it "should mark the reminder.verified to true" do reminder = build(:reminder, verified: false) reminder.update_verified expect(reminder.verified).to eq(true) end end 的新值true未被保留。但是,当我在控制台中运行该方法时,它工作正常。想法?

verified

7 个答案:

答案 0 :(得分:7)

您只需要重新加载对象:

expect(reminder.reload.verified).to eq(true)

答案 1 :(得分:3)

我发现这有助于检查该方法是否将更改保存到数据库中的对象:

expect { reminder.update_verified }.to change(reminder, :updated_at)

说明

调用self.update(verified: true)不仅会更新verified列,还会更新updated_at列。然后,我们可以检查updated_at列中的更改,以验证是否已保存对对象的更改。

答案 2 :(得分:2)

这很奇怪,但我认为您应该从build(:reminder, verified: false)更改为create(:reminder, verified: false),然后使用其他人在上面指定的reload方法。

答案 3 :(得分:1)

您需要在对象上调用reload 请关注rspec best practices:使用letsubject

describe "#update_verified" do
  let(:reminder) { build(:reminder, verified: false) }
  subject { reminder.update_verified }
  it "should mark the reminder.verified to true" do
    subject
    expect(reminder.reload.verified).to eq(true)
  end
end

<强>更新
问题出在build方法中。它会创建新对象,而不会将对象保存到DB 将build替换为create方法。

答案 4 :(得分:1)

无论您使用update_column还是let

build始终有效

答案 5 :(得分:0)

第一次调用reminder.update_verified时,您的对象尚未持久。代替更新,它只会创建一个具有指定属性的对象。当您第二次调用它时,它会正常工作,因为对象已保留。您需要更改构建才能创建,并且可以正常工作。

答案 6 :(得分:0)

这对我有用

-Option AllScope