我正在尝试对以下代码进行单元测试:
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
,它就会通过。