我有一个非常简单的模型Reminder
,它的布尔属性为verified
,我想测试我的方法update_verified
,它只是将属性verified
设置为true
。我用的是rspec和工厂女孩。
# 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
由于某种原因,当我运行测试时,属性verified
的新值true
没有被持久化。但是,当我在控制台中运行该方法时,它工作得很好。有什么想法?
1) Reminder#update_verified should mark the reminder.verified to true
Failure/Error: expect(reminder.verified).to eq(true)
expected: true
got: false
(compared using ==)
# ./spec/models/reminder_spec.rb:46:in `block (3 levels) in <top (required)>'
Finished in 0.19193 seconds (files took 7.07 seconds to load)
7条答案
按热度按时间wd2eg0qa1#
你只需要重新加载你的对象:
nbnkbykc2#
这对我很有效
z18hc3ub3#
我发现这有助于检查该方法是否保存了对数据库中对象的更改:
说明
调用
self.update(verified: true)
不仅会更新verified
-列,还会更新updated_at
-列。然后,我们可以检查updated_at
-列中的更改,以验证对对象的更改是否已保存。gc0ot86w4#
这很奇怪,但我认为你应该把
build(:reminder, verified: false)
改为create(:reminder, verified: false)
,然后像上面其他人指定的那样使用reload
方法。13z8s7eq5#
你需要在对象上调用
reload
。请遵循rspec best practices:使用
let
和subject
。更新
问题出在
build
方法中。它创建新对象,但不将对象保存到数据库。将
build
替换为create
方法。jobtbby36#
无论您使用
let
还是build
,update_column
都可以正常工作pbwdgjma7#
当你第一次调用
reminder.update_verified
时,你的对象还没有持久化。它将只创建一个具有指定属性的对象,而不是更新。当您第二次调用它时,它将正常工作,因为对象是持久化的。你需要改变构建来创造它会成功的。