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

the*_*tto 4 ruby rspec ruby-on-rails

我有一个非常简单的模型Reminder,使用布尔属性调用,verified我想测试我的方法update_verified,只需将属性设置verifiedtrue.我正在使用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
Run Code Online (Sandbox Code Playgroud)

出于某种原因,当我运行测试时,true属性的新值verified不会被持久化.但是,当我在控制台中运行该方法时,它工作正常.思考?

  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)
Run Code Online (Sandbox Code Playgroud)

Fra*_*ang 10

这对我有用

expect do
  reminder.update_verified
  reminder.reload
end.to change(reminder, :verified).from(false).to(true)
Run Code Online (Sandbox Code Playgroud)


Ant*_*ony 9

您只需要重新加载对象:

expect(reminder.reload.verified).to eq(true)
Run Code Online (Sandbox Code Playgroud)


And*_*eas 5

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

expect { reminder.update_verified }.to change(reminder, :updated_at)
Run Code Online (Sandbox Code Playgroud)

说明

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