水豚的规格与时间嘲笑头痛

时间:2014-10-14 03:19:31

标签: ruby-on-rails ruby unit-testing rspec capybara

我一直在与一个非常奇怪的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

0 个答案:

没有答案