我有一个发送明天日期(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)
任何人都可以告诉我如何解决这个问题
答案 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