我一直在与一个非常奇怪的Capybara / Rspec行为挣扎,这与Time.now嘲笑有关。
首先,我尝试定义一组规范,其中一些模型将三个日期字段设置为DateTime.stub(:now) { DateTime.now.utc }
上的值。通过执行rspec spec
执行整个测试套件时,测试总是失败,但是,当rspec spec/features/feature
所有定义的规格都已成功时。
在研究时,有些人建议使用Timecop或Delorean宝石假冒当前时间以避免与Capybara有问题。我试过没有运气。我在before/after each
块中添加了类似Timecop.travel(time)
的内容;这次所有套件的规格都成功了,但是执行单个spec文件确实会产生失败的规格。
在上个月/周/天计算我的自行车平均速度计算我的自行车平均速度
时,最好的方法是保证处理时间规格的确定性结果?我希望在给定的固定日期内始终执行所有此类规范(在rspec spec/features/feature
中定义),让我们说 2010年6月13日15:70:00 ,以便我能做到,DateTime.now-1.year
我得到 2009年6月13日15:70:00 ,无论我是将其作为单独的spec文件还是作为套件执行,结果始终保持一致。
测试失败的示例:
describe "Stats Spec" do
include IntegrationHelper
before :each do
I18n.locale = :en
DateTime.stub(:now) { DateTime.new(2012,10,11,14,50).utc }
end
context "Given Loui has been cycling during the last year" do
before(:each) do
@loui = Fabricate(:standard_user, username: 'Loui')
stub_track(:today, @loui.id, 3000)
stub_track(:this_week, @loui.id, 5000)
stub_track(:this_month, @loui.id, 8000)
stub_track(:six_months_ago, @loui.id, 3000)
end
specify "he should be able to see his kms and today stats", js: true do
# This spec checks that 3 km appear when clicked on "show today stats" button
end
specify "he should be able to see his kms and week stats", js: true do
# This spec checks that 3+5 km appear when clicked on "show weekly stats" button
end
end
end
def stub_track(time, user_id, meters)
# Fabricates a track using DateTime.now-(3.days/1.week/2.months) with the provided
# user_id and provided meters
end