单元测试 使用 rr 更新 mongoid 字段



我正在尝试对以下代码进行单元测试:

require 'mongoid'
class Seller
  include Mongoid::Document
  field :updated_at, type: Time
  def update_updated_at
    updated_at = Time.now
    save
  end
end

这是我的尝试

describe Seller do
  describe 'update_updated_at' do
    it 'sets updated_at to Time.now' do
      now = Time.new(2013,10,14)
      seller = Seller.new
      mock(Time).now { now }
      mock(seller).updated_at= now
      mock(seller).save
      seller.update_updated_at
    end
  end
end

我遇到以下故障

updated_at=(2013-10-14 00:00:00 -0600)
Called 0 times.
Expected 1 times.

这是将记录updated_at属性更新为当前时间的本机方法例如

seller = Seller.first
seller.touch # updated_at set to current time
为了模拟时间

类,有一个宝石时间警察,它非常易于使用和死简单的时间,日期时间模拟,例如

it 'sets updated_at to Time.now' do
    now = Time.new(2013,10,14)
    Timecop.freeze(now) do
      seller = Seller.new
      seller.save # 2013-10-14
      seller.touch # same time 2013-10-14
    end
end
没有必要

嘲笑这个。想想你在这里做什么:你正在设置updated_at并将其保存到数据库中。存根/模拟 #save 通常是一种代码气味 - 您可以相信它正在做它应该做的事情,即数据库的持久属性。因此,调用该方法,重新加载记录,然后断言updated_at设置为当前时间(截至调用该方法时为止)。

或者,只需使用触摸;)

顺便说一下,这个测试失败了,因为你使用了updated_at = Time.now;如果你使用self.updated_at = Time.now,它就会通过。

相关内容

  • 没有找到相关文章

最新更新