0

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

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.
4

2 回答 2

1

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

seller = Seller.first
seller.touch # updated_at set to current time

为了模拟 Time 类,有一个 gem timecop,它非常易于使用并且非常简单 Time,DateTime 模拟,例如

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
于 2013-10-14T16:12:31.473 回答
1

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

或者,只需使用触摸 ;)

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

于 2013-10-15T04:00:54.620 回答