【问题标题】:Setting system time in rspec tests without changing system clock在 rspec 测试中设置系统时间而不更改系统时钟
【发布时间】:2013-04-05 04:05:10
【问题描述】:

我正在努力让 Rails 3 应用程序准备好使用时区。我的开发机器在 EDT 中,而我托管的服务器在 UTC 中。在我的 rspec 测试中是否有办法更改 ruby​​ 正在使用的系统时区,以便我使用相同的系统时区运行测试而无需更改计算机上的系统时钟?我调查过 Delorean 和 Timecop,但它们不是我要找的。我正在寻找类似的东西

Time.system_time_zone = "UTC"

...然后 Time.now 将返回 UTC 时间,而不是我的系统时区设置。

【问题讨论】:

    标签: ruby-on-rails ruby rspec timezone clock


    【解决方案1】:
    before {Time.stub(:now) {Time.now.utc}}
    

    这样,在您的测试中调用Time.now 的任何地方,它都会以UTC 格式返回您的系统时间。

    例子:

    describe Time do
      before {Time.stub(:now) {Time.now.utc}}
    
      it "returns utc as my system's time" do
        Time.now.utc?.should be_true
      end
    end
    

    【讨论】:

    • 谢谢查尔斯,我希望有一个更全球化的设置,但这正是我所需要的。
    • @JoshuaMuheim 我相信TimeCop gem 可以做到这一点。
    • 谢谢,但它似乎不再积极维护了。
    【解决方案2】:

    Rails 准确地为您提供所需的内容:

    Time.zone = "UTC"
    

    查看http://api.rubyonrails.org/classes/Time.html#method-c-zone-3D了解更多信息。

    【讨论】:

    • 这不符合我的要求。这告诉 Rails,当您通过 Time.zone 将事物放入 Time.zone 指定的时区时。当您使用 Time.now 时,我希望在 UTC 中返回时间。
    • 对,您需要拨打Time.zone.nowTime.current 而不是Time.now
    • 对,但我的问题的整个想法是将我的测试中的系统时间设置为 UTC。您的解决方案正在做的是告诉 Rails 通过“Time.zone”将所有时间转换为 UTC。执行“Time.now”仍会为您提供系统指定时区的时间。 Charles 的解决方案就是这样做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多