2013-10-14 88 views
0

更新mongoid场我试图单元测试下面的代码:单元测试使用RR

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. 

回答

1

Here是更新记录updated_at属性到当前时间的本地方法 例如

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

嘲笑Time类有一个宝石timecop这是超级好用,死简单TIME,DATETIME嘲讽e.g

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 
+0

+1用于引入timecop。 +1用于触摸。 – zhon

1

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

或者,只是使用触摸;)

通过本次测试失败,因为你使用updated_at = Time.now的方式;如果您使用self.updated_at = Time.now,它会通过。

+1

这是*单元测试*。我不想在单元测试中打我的数据库。嘲笑'''保存'''确保我打电话保存没有击中数据库。 – zhon

+0

+1用于解决'''self.update_at = Time.now'''的问题。谢谢! – zhon