如果不在ruby中使用sleep(),我将如何测试/测试updated_at字段?

如何在不使用sleep(1.second)方法的情况下编写规范?当我删除睡眠时,我的测试会因为返回相同的时间戳而中断?

我有以下类方法

def skip
qs = find_or_create_by(user_id: user_id)
qs.set_updated_at
qs.n_skip += 1
qs.save!
end

并遵循以下规范:

qs = skip(user.id)
    sleep(1.second)
    qs2 = skip(user.id)
    qs.should_not be_nil
    qs2.should_not be_nil
    (qs.updated_at < qs2.updated_at).should be_true

解决方法

我过去曾使用 Timecop gem进行基于时间的测试.
require 'timecop'
require 'test/unit'

class MyTestCase < Test::Unit::TestCase
  def test_mortgage_due_in_30_days
    john = User.find(1)
    john.sign_mortgage!
    assert !john.mortgage_payment_due?
    Timecop.travel(Time.Now + 30.days) do
      assert john.mortgage_payment_due?
    end
  end
end

所以你的例子看起来像:

qs = skip(user.id)

Timecop.travel(Time.Now + 1.minute) do
  qs2 = skip(user.id)
end

qs.should_not be_nil
qs2.should_not be_nil
(qs.updated_at < qs2.updated_at).should be_true

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...