Ruby on rails 如何控制capybara/phantomjs测试的时间

Ruby on rails 如何控制capybara/phantomjs测试的时间,ruby-on-rails,testing,phantomjs,capybara,timecop,Ruby On Rails,Testing,Phantomjs,Capybara,Timecop,我想测试一下,在一天的不同时间,在不同的时区,一些截止日期是否能够正确地显示给用户。我的测试使用的是capybara+rspec+phantomjs 我正在将一个块传递给Timecop.travel(datetime),该块中的测试代码正确地获得了模拟的日期时间,但看起来PhantomJS/模拟浏览器没有获得模拟的时间 有没有已知的方法让PhantomJS与Timecop一起工作?或者用其他方法模拟或操纵时间来进行测试 这里有一个简单的例子来说明我的意思 时间规格rb: user.html.er

我想测试一下,在一天的不同时间,在不同的时区,一些截止日期是否能够正确地显示给用户。我的测试使用的是capybara+rspec+phantomjs

我正在将一个块传递给Timecop.travel(datetime),该块中的测试代码正确地获得了模拟的日期时间,但看起来PhantomJS/模拟浏览器没有获得模拟的时间

有没有已知的方法让PhantomJS与Timecop一起工作?或者用其他方法模拟或操纵时间来进行测试

这里有一个简单的例子来说明我的意思

时间规格rb: user.html.erb:
今天是

var now=moment().format() $('p').append(Javascript说“+now+”

”)
运行测试的输出:
故障:
1) 仪表板应显示时间旅行日期
失败/错误:page.应该有_文本(“Javascript说2001-01-01”)
预计会在中找到文本“Javascript说2001-01-01”
“今天是2001-01-01T01:01:00-08:00,2017-01-24T12:36:02-08:00”
#./spec/features/time_spec.rb:67:in'block(3层)in'
#/gems/ruby-2.2.0/gems/timecop-0.8.0/lib/timecop/timecop.rb:147:in“旅行”
#/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“旅行”
#./spec/features/time_spec.rb:59:in'block(2层)in'

正如您所发现的,TimeCop只调整服务器时间,但浏览器使用系统时间。有许多JS库允许时间伪造,它们都通过模拟JS Date类来工作。我成功使用的一个是,通过执行以下操作在我的
\u head.html.haml
文件中实现的

- if defined?(Timecop) && Timecop.top_stack_item
  = javascript_include_tag "testing/sinon-1.17.3.js"
  - unix_millis = (Time.now.to_f * 1000.0).to_i
  :javascript
    sinon.useFakeTimers(#{unix_millis});
在需要任何其他JS之前。这会将任何页面中的浏览器时间设置为Timecop设置的任何值

<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)>'
- if defined?(Timecop) && Timecop.top_stack_item
  = javascript_include_tag "testing/sinon-1.17.3.js"
  - unix_millis = (Time.now.to_f * 1000.0).to_i
  :javascript
    sinon.useFakeTimers(#{unix_millis});