在 rspec 中添加明天的日期

Stubbing tomorrow's date in rspec

我有一种方法可以发送明天的日期 (1.date.from_now)。我正在我的规范中测试相同的方法。谁能告诉我如何标记那个日期。

如果我现在通过 1.date.from。我收到以下错误。

   <S3Client (class)> received :upload_csv_by_path with unexpected arguments
     expected: ("/home/projects/sh/tmp/test_exporter.csv", nil, {:expires=>Sat, 07 Feb 2015 11:36:39 UTC +00:00})
          got: ("/home/projects/sh/tmp/test_exporter.csv", nil, {:expires=>Sat, 07 Feb 2015 11:36:39 UTC +00:00})

下面是我的方法

S3Client.upload_csv_by_path(file_name, nil, expires: 1.day.from_now)

这是我的规格,

S3Client.should_receive(:upload_csv_by_path).with("#{Rails.root}/tmp/scalar_test_exporter.csv", nil, expires: 1.day.from_now)

谁能告诉我如何解决这个问题

通过在我的方法中使用 Time.now + 1.day 解决了。

并存入 Time.now 并在传递参数时添加 1day,如下所示。

current_time = Time.now
Time.stub(:now) { current_time }
S3Client.should_receive(:upload_csv_by_path).with("#{Rails.root}/tmp/scalar_test_exporter.csv", nil, expires: current_time + 1.day)

问题是时间可能看起来完全一样,但时间戳不是,运行 两个语句之间花费的时间(即使以微秒为单位)使时间不同, 要解决它,您应该在两个语句中使用相同的时间变量,例如:

time = Time.now
S3Client.should_receive(:upload_csv_by_path).with("#{Rails.root}/tmp/scalar_test_exporter.csv", nil, expires: time)
S3Client.upload_csv_by_path(file_name, nil, expires: time)

这样你可以确保两个语句中的时间相同,或者你可以使用 gem 之类的 timecop 来帮助你解决这个问题,就像 @gotva 建议的那样,timecop 非常有用很有用,因为它让你能够冻结时间,及时向前和向后移动,这很好,对于你写这个的同一个例子

Time.freeze
S3Client.should_receive(:upload_csv_by_path).with("#{Rails.root}/tmp/scalar_test_exporter.csv", nil, expires: 1.day.from_now)
S3Client.upload_csv_by_path(file_name, nil, expires: 1.day.from_now)
Time.return