我有一个方法,使用DateTime.now来执行一些数据的搜索,我想测试具有各种日期的方法,但我不知道如何存根DateTime.now也不能让它使用Timecop(如果它甚至像那样工作).
随着时间的警察我试过
it 'has the correct amount if falls in the previous month' do
t = "25 May".to_datetime
Timecop.travel(t)
puts DateTime.now
expect(@employee.monthly_sales).to eq 150
end
Run Code Online (Sandbox Code Playgroud)
当我运行规范时,我可以看到放置DateTime.now 2015-05-25T01:00:00+01:00但是在我正在测试输出2015-07-24T08:57:53+01:00(今天的日期)的方法中使用相同的DateTime.now .我怎么能做到这一点?
------------------更新------------------------------- --------------------
我在一个before(:all)块中设置了记录(@employee等),这似乎导致了问题.它仅在Timecop do块之后完成设置时才有效.为什么会这样?
我在使用rspec,capybara,capybara-webkit和timecop看到一些集成规范中的错误.
Capybara::FrozenInTime:
time appears to be frozen, Capybara does not work with libraries which freeze time, consider using time travelling instead
Run Code Online (Sandbox Code Playgroud)
我知道冻结时间的唯一宝石是Timecop,但我没有在失败的测试用例中使用它.
由于错误只是偶尔发生,我甚至无法知道它在改变之后是否消失.
我想测试一些截止日期是否在不同时区和一天中的不同时间正确显示给用户。我的测试使用水豚+rspec+phantomjs。
我正在将一个块传递给 Timecop.travel(datetime) 并且该块内的测试代码正确地获取了模拟的日期时间,但看起来 PhantomJS / 模拟的浏览器没有得到模拟的时间。
有没有什么已知的方法可以让 PhantomJS 与 Timecop 一起工作?或者其他方法来模拟或操纵时间以进行测试?
这是一个简单的例子来说明我的意思。
it "should show the Time travel date" do
# current date is 2017-01-24
Date.today.should == Date.parse("2017-01-24")
Timecop.travel( Time.parse("2001-01-01 01:01") ) {
sign_in(user)
visit "/#{user.username}"
Date.today.should == Date.parse("2001-01-01")
page.should have_text("Today is 2001-01-01")
page.should have_text("Javascript says 2001-01-01")
}
end
Run Code Online (Sandbox Code Playgroud)
<p>Today is <%= Time.now.iso8601 %></p>
<script>
var now = moment().format()
$('p').append("<p>Javascript says "+now+"</p>")
</script>
Run Code Online (Sandbox Code Playgroud)
Failures:
1) Dashboard should show the time travel date
Failure/Error: page.should have_text("Javascript says …Run Code Online (Sandbox Code Playgroud)