【问题标题】:Unit Testing updating a mongoid field using rr使用 rr 更新 mongoid 字段的单元测试
【发布时间】:2013-10-14 15:53:56
【问题描述】:

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

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.

【问题讨论】:

    标签: ruby unit-testing mongoid minitest rr


    【解决方案1】:

    Here 是将记录 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
    

    【讨论】:

      【解决方案2】:

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

      或者,只需使用触摸;)

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

      【讨论】:

      • 这是一个单元测试。我不想在单元测试中访问我的数据库。模拟 save 确保我在调用 save 时不会访问数据库。
      • +1 用于解决问题self.update_at = Time.now。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 2019-06-18
      • 2014-07-07
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      相关资源
      最近更新 更多