ruby rails rspec测试更新模型属性

kninwzqo  于 2023-06-22  发布在  Ruby
关注(0)|答案(7)|浏览(156)

我有一个非常简单的模型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)
wd2eg0qa

wd2eg0qa1#

你只需要重新加载你的对象:

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

nbnkbykc2#

这对我很有效

expect do
  reminder.update_verified
  reminder.reload
end.to change(reminder, :verified).from(false).to(true)
z18hc3ub

z18hc3ub3#

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

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

说明

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

gc0ot86w

gc0ot86w4#

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

13z8s7eq

13z8s7eq5#

你需要在对象上调用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方法中。它创建新对象,但不将对象保存到数据库。
build替换为create方法。

jobtbby3

jobtbby36#

无论您使用let还是buildupdate_column都可以正常工作

pbwdgjma

pbwdgjma7#

当你第一次调用reminder.update_verified时,你的对象还没有持久化。它将只创建一个具有指定属性的对象,而不是更新。当您第二次调用它时,它将正常工作,因为对象是持久化的。你需要改变构建来创造它会成功的。

相关问题