ruby-on-rails 存根浏览器时间和时区与水豚

lo8azlld  于 2023-04-08  发布在  Ruby
关注(0)|答案(4)|浏览(188)

我有一个JavaScript组件(例如日期选择器),它严重依赖于-
1.当前系统时间
1.当前系统时区
在Ruby和Capybara中,可以在Timecop等库的帮助下随时存根。
是否也可以在Capybara控制的无头浏览器中存根这些值?
谢谢!
编辑:这里有一个例子,说明Ruby是如何被存根化的,但是Capybara的浏览器仍然使用系统时间

before do
  now = Time.zone.parse("Apr 15, 2018 12:00PM")
  Timecop.freeze(now)

  visit root_path

  binding.pry
end

> Time.zone.now
=> Sun, 15 Apr 2018 12:00:00 UTC +00:00

> page.evaluate_script("new Date();")
=> "2018-03-27T04:15:44Z"
kr98yfug

kr98yfug1#

正如你所发现的,Timecop只影响测试和测试中的应用程序的时间。浏览器作为一个单独的进程运行,完全不受Timecop的影响。因此,你需要在浏览器中使用许多JS库中的一个来存根/模拟时间。我通常使用的是sinon-http://sinonjs.org/-,我在页面head中有条件地安装它,使用类似

- if defined?(Timecop) && Timecop.top_stack_item
  = javascript_include_tag "sinon.js" # adjust based on where you're loading sinon from
  - unix_millis = (Time.now.to_f * 1000.0).to_i
  :javascript
    sinon.useFakeTimers(#{unix_millis});

这应该可以在haml模板中工作(如果使用erb则进行调整),并且每当访问页面时都会安装和模拟浏览器时间,而Timecop则用于模拟应用程序时间。

mwg9r5ms

mwg9r5ms2#

我知道这个问题有点老了,但我们有同样的请求,并找到了以下解决方案来使用rails6:

context 'different timezones between back-end and front-end' do
        it 'shows the event timestamp according to front-end timezone' do
          # Arrange
          previous_timezone = Time.zone
          previous_timezone_env = ENV['TZ']

          server_timezone = "Europe/Copenhagen"
          browser_timezone = "America/Godthab"

          Time.zone = server_timezone
          ENV['TZ'] = browser_timezone

          Capybara.using_session(browser_timezone) do
            freeze_time do
              # Act
              # ... Code here

              # Assert
              server_clock = Time.zone.now.strftime('%H:%M')
              client_clock = Time.zone.now.in_time_zone(browser_timezone).strftime('%H:%M')
              expect(page).not_to have_content(server_clock)
              expect(page).to have_content(client_clock)
            end
          end
          # (restore)
          Time.zone = previous_timezone
          ENV['TZ'] = previous_timezone_env
        end
end
wz1wpwve

wz1wpwve3#

这有助于我与zonebie gem配对使用

RSpec.configure do |config|
  config.before(:suite) do
    ENV['TZ'] = Time.zone.tzinfo.name
    # ...
  end
end
zy1mlcev

zy1mlcev4#

您可以在注册水豚驱动程序时传递时区进行测试:

Capybara.register_driver :selenium_remote_chrome do |app|
    options = Selenium::WebDriver::Chrome::Options.new

    # Set Chrome to use UTC instead of the computer's timezone.
    options.add_argument('--time-zone-for-testing=UTC')
  end

相关问题