我有一个名为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
答案 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:使用let
和subject
。
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