我想测试一些截止日期是在不同的时区和一天中的不同时间正确显示给用户的。我的测试是使用capybara + 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
<p>Today is <%= Time.now.iso8601 %></p>
<script>
var now = moment().format()
$('p').append("<p>Javascript says "+now+"</p>")
</script>
Failures:
1) Dashboard should show the time travel date
Failure/Error: page.should have_text("Javascript says 2001-01-01")
expected to find text "Javascript says 2001-01-01" in
"Today is 2001-01-01T01:01:00-08:00 Javascript says 2017-01-24T12:36:02-08:00"
# ./spec/features/time_spec.rb:67:in `block (3 levels) in <top (required)>'
# /gems/ruby-2.2.0/gems/timecop-0.8.0/lib/timecop/timecop.rb:147:in `travel'
# /gems/ruby-2.2.0/gems/timecop-0.8.0/lib/timecop/timecop.rb:121:in `send_travel'
# /gems/ruby-2.2.0/gems/timecop-0.8.0/lib/timecop/timecop.rb:62:in `travel'
# ./spec/features/time_spec.rb:59:in `block (2 levels) in <top (required)>'
答案 0 :(得分:2)
正如您所发现的,TimeCop仅调整服务器时间,但浏览器使用系统时间。有许多JS库允许时间伪造,所有这些都是通过模拟JS Date Class来完成的。我成功使用的是Sinon.JS我通过
在我的$posts = getSearchPosts();
foreach ($posts as $post) {
?>
<div class="ui-corner-all custom-corners">
<div id="searchpost">
<?php
echo $post['search_role'];
echo $post['search_genre'];
?>
</div>
</div>
<?php
}
$users = getAllPosts();
foreach ($users as $user) {
?>
<div class="ui-corner-all custom-corners">
<div id="searchpost">
<?php
echo $user['user_first_name'];
echo $post['user_last_name'];
?>
</div>
</div>
<?php
}
文件中实现的
_head.html.haml
在要求任何其他JS之前。这将在任何设置为Timecop的页面中设置浏览器时间。