问题标签 [timecop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4872 浏览

ruby-on-rails - Rails - 测试使用 DateTime.now 的方法

我有一个使用 DateTime.now 对某些数据执行搜索的方法,我想用各种日期测试该方法,但我不知道如何存根 DateTime.now 也不能让它与 Timecop 一起使用(如果它甚至像那样工作)。

随着时间警察我试过了

当我运行规范时,我可以看到 puts DateTime.now 给出2015-05-25T01:00:00+01:00但在我正在测试输出的方法中具有相同的 puts DateTime.now 2015-07-24T08:57:53+01:00(今天的日期)。我怎样才能做到这一点?

- - - - - - - - - 更新 - - - - - - - - - - - - - - - - --------------------

before(:all)我正在一个似乎导致问题的块中设置记录(@employee 等) 。它仅在Timecop do块之后完成设置时才有效。为什么会这样?

0 投票
1 回答
882 浏览

ruby - 水豚集成测试中的冻结时间

我正在使用 capybara 和 capybara-webkit 编写一个集成测试,我需要比较两次并且它随机失败,因为有时第二次通过并且我有失败之类的

在非集成测试中,我必须处理我使用的时间,Timecop.freeze但如果我在这里尝试,我会得到

水豚::FrozenInTime:

时间似乎被冻结了,Capybara 不适用于冻结时间的库,请考虑改用时间旅行

但是,据我了解,时间旅行并不能解决我的问题,因为时间差始终为 1 秒。

有没有办法可以确保在测试执行期间时间不会改变?

谢谢

0 投票
1 回答
137 浏览

ruby-on-rails - Timecop 无法正确模拟日期

我正在使用 TimeCop Gem 来测试时间敏感的测试用例。lib 目录下只有一个文件。它只包含字符串常量。

例子。

在我的黄瓜测试用例中,这部分代码没有模拟时间。它选择系统时间。这是为什么?

0 投票
1 回答
860 浏览

ruby-on-rails - Timecop 不适用于 FactoryGirl 中定义的 DateTime 属性

我有以下工厂:

在我的规范中,我以这种方式使用 Timecop:

Time.now 和 Date.today 按预期使用给定时间存根,但工厂的 due_date 属性始终根据系统日期返回,我希望它根据 Timecop 中提供的日期返回。可能吗?

我正在使用 Ruby 2.2.2、Rails 3.2.22、Timecop 0.8.0 和 Rspec 3.1.0。

0 投票
1 回答
625 浏览

ruby-on-rails - 带有 Factory_girl 的 Timecop:工厂未按预期对日期属性进行排序

我正在使用timecop gem 来删除日期。我还在使用factory_girl以便更轻松地为我的规格创建对象。

这是我的工厂:

假设今天的实际日期是 09/07/2016。

这是我的规格:

当规范在这里运行时是输出:

在第一行输出中: Timecop 在我调用时按预期工作Date.today。它已成功冻结时间并返回该冻结时间。

但是:第二行没有按预期工作。它显然是在使用该系统Date,而不是 Timecop 的 frozen Date。排序的end_date应按顺序将 +1 年添加到当前冻结的日期。因此:我希望end_date这里是09/30/2011,而不是09/30/2017

我怎样才能使序列end_date化的属性脱离 Timecop 的Date而不是系统的Date

0 投票
1 回答
1119 浏览

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

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

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

有什么已知的方法可以让 PhantomJS 与 Timecop 一起工作吗?或者其他方式来模拟或操纵时间以进行测试?

这是一个简单的例子来说明我的意思。

time_spec.rb:

用户.html.erb:

运行测试的输出:

0 投票
1 回答
987 浏览

ruby-on-rails - 使用 timecop 围绕 shared_example 的 Rspec

我正在尝试总结我写Timecopshared_example规范

但是运行这个规范仍然使用实时而不是冻结的

Timecop可以这样工作吗?

我怎么能包装我的大块测试文件但改变它的运行时间

0 投票
1 回答
519 浏览

rspec - 设计,Capybara - 'UncaughtThrowError (uncaught throw :warden)' 可能是由于 Timecop

我的一些功能规格间歇性地失败了。我们的规格将基线设置为过去。我发现了以下内容:

  • 抛出的错误是:

UncaughtThrowError(未捕获的抛出:warden):

[#B3FBC85E07A6] 设计 (4.3.0) lib/devise/hooks/timeoutable.rb:26:in 'throw'

[#B3FBC85E07A6] 设计 (4.3.0) lib/devise/hooks/timeoutable.rb:26:in 'block in'

[#B3FBC85E07A6] 守望者 (1.2.7) lib/warden/hooks.rb:15:in 'block in _run_callbacks'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/hooks.rb:10:in 'each'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/hooks.rb:10:in '_run_callbacks'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/manager.rb:52:in '_run_callbacks'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/proxy.rb:180:in 'set_user'

[#B3FBC85E07A6] 守望者 (1.2.7) lib/warden/test/helpers.rb:21:in 'block in login_as'

[#B3FBC85E07A6]warden (1.2.7) lib/warden.rb:40:in 'block in test_mode!'

[#B3FBC85E07A6] 守望者 (1.2.7) lib/warden/hooks.rb:15:in 'block in _run_callbacks'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/hooks.rb:10:in 'each'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/hooks.rb:10:in '_run_callbacks'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/manager.rb:52:in '_run_callbacks'

...

  • 仅在我使用 Timecop 时失败

查看错误(在 timeoutable.rb 中引发了异常)和 Timecop 的常见用法,我认为这是负责任的 - 但我无法解释它为什么会发生,也无法解释为什么它是间歇性的。

这是一个示例代码,可以进一步解释该问题:

请注意,尽管在时间旅行后登录,但有时仍会出现错误。

一切正常,实际上这个测试(和其他几个)最多每 50 多次失败 1 次。

任何帮助深表感谢。提前致谢。

编辑:根据屏幕截图,访问页面时发生错误。此屏幕截图来自 Capybara 失败,就在我尝试访问页面之后。未捕获的异常

0 投票
1 回答
628 浏览

ruby-on-rails - 与 Protobuf 相关的单元测试在我的本地机器上通过但在 Jenkins 管道中失败

我的 Rails 应用程序中有一组序列化程序对象的单元测试。这些序列化器对象使用google-protobuf (~> 3.5)gem,包括Google::Protobuf::Timestamp对象。对于与时间相关的属性(如purchase_order#created_atline_item#created_atinspection_event#event_occured_at),我们使用 TimeSerializer 对象,实现如下:

这是通过调用实例化的ProtoSerializers::TimeSerializer.serialize(time),其中time是 Rails Time 或 DateTime 对象。

测试将序列化的预期结果与实际结果进行比较,如果结果匹配则通过,否则失败:

根据标准 Rails 实践,PurchaseOrderLineItem模型都具有created_at属性。

这个测试在我的机器上通过,但是当我将它推送到 Github 时失败(它启动了 Jenkins 测试管道)。预期与实际的差异如下所示:

如您所见,seconds属性匹配,但属性nanos偏离了几百纳秒。我尝试在此测试中使用 Timecop,如下所示,但失败的测试仍然存在:

我不确定 Jenkins 管道和我的机器有什么不同。我正在使用带有 Intel Core i7 处理器的 Macbook,我相信它是 64 位的。

0 投票
2 回答
424 浏览

ruby-on-rails - 相对于 rspec 中的 timecop 的 Ruby 常量日期变量

嗨,我有一个 Ruby 类,其中包含一些使用 Date 的常量变量:

START_DATE = Date.current.at_beginning_of_month.in_time_zone + 2.days

LAST_DATE = Date.current.at_beginning_of_month.in_time_zone + 10.days

我有一些方法在里面使用这个日期,如下所示:

Date.current.in_time_zone.between?(START_DATE, LAST_DATE)

在我正在使用的 rspec 文件中Timecop.freeze,它破坏了我的测试。

是否有一种解决方法可以对我的大多数方法使用相同的变量?还是我使用不正确?

我将不胜感激任何帮助!