2017-01-24 14 views
1

私はいくつかの期限が、異なる時間帯と異なる時間帯に正しく表示されることをテストしたいと思います。私のテストではcapybara + rspec + phantomjsを使用しています。capybara/phantomjsテストの時間を制御する方法

私はブロックをTimecop.travel(datetime)に渡しています。そのブロック内のテスト内のコードが模擬datetimeを正しく取得していますが、PhantomJS/mockedブラウザが模擬時間を取得していないようです。

PhantomJSをTimecopと連動させる方法はありますか?あるいは、テスト目的のために時間を模擬したり操作したりする他の方法?

ここに、私が意味するものを説明する簡単な例があります。

time_spec.rb:

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 

user.html.erb:テストを実行しているの

<p>Today is <%= Time.now.iso8601 %></p> 
<script> 
    var now = moment().format() 
    $('p').append("<p>Javascript says "+now+"</p>") 
</script> 

出力:あなたはTimeCopだけ調整

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)>' 

答えて

1

を発見してきたようにサーバの時間はかかりますが、ブラウザはシステム時間を使用します。時間の偽造を可能にするJSライブラリが数多くあります。そのすべてがJS Date Classを嘲笑して動作します。私は正常に使用している一つは、私は、他のJSを必要とする前に

- 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}); 

を行うことによって、私の_head.html.hamlファイルに実装Sinon.JSあります。これにより、Timecopが設定されているページにレンダリングされたページのブラウザ時間が設定されます。

関連する問題