将明天的日期记录在rspec中

时间:2015-02-06 11:50:25

标签: rspec-rails ruby-on-rails-4.1

我有一个发送明天日期(1.date.from_now)的方法。我在我的规格中测试相同的方法。谁能告诉我如何存根那个日期。

如果我从现在开始通过1.date.我得到了以下错误。

   <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)

任何人都可以告诉我如何解决这个问题

2 个答案:

答案 0 :(得分:0)

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

并对Time.now进行存根,并在传递参数时添加1天,如下所示。

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)

答案 1 :(得分:0)

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

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)

通过这种方式,您可以确保两个语句中的时间相同,或者您可以使用像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