【问题标题】:Making NSTimeZone Trouble Free in Unit Tests使 NSTimeZone 在单元测试中无故障
【发布时间】:2013-01-16 21:34:54
【问题描述】:

因此,在 Objective-C 中对日历代码进行单元测试的问题是:时区包含有关夏令时的信息,因此您在夏天编写了一个测试,预计 6 月 10 日的日出将在早上 6:02 发生。您的测试通过了,稍后,您在不是 DST 时运行测试并且您失败了,因为当您获得时区时,夏令时被关闭。

似乎没有一种简单的方法可以告诉它在打开 dst 的情况下为您提供时区?

我正在考虑创建一个类别,以便拦截时区调用,但这听起来非常混乱,因为我不知道你在操纵什么日期。

当然,我可以编写所有测试来检查时区设置,然后改变我的所有期望,但这听起来是所有可能选择中最糟糕的。

【问题讨论】:

    标签: objective-c date date-math


    【解决方案1】:

    特定地区的时区必须考虑夏令时,才能准确计算两个日期(和时间)之间的间隔。如果您对此不感兴趣,也许您可​​以改用 UTC“时区”,它根本不会改变。

    例如,新西兰标准时间定义为 UTC+12:00,新西兰夏令时定义为 UTC+13:00。尽管新西兰的当地时间在夏令时期间有所不同,但 UTC+12:00 的时间保持不变(也就是说,所有其他也使用 UTC+12:00 的国家不会因为夏令时而神奇地向前移动已在新西兰开始)。

    您只需提供 UTC 偏移量作为名称即可实现此目的:

    NSTimeZone *utc_plus12 = [NSTimeZone timeZoneWithName:@"UTC+12:00"];
    

    找出您所在地区的夏令时所基于的 UTC 偏移量并使用它。

    【讨论】:

    • 不是我不感兴趣,而是它会给我今天的夏令时设置,当测试运行时,而不是测试的日期。那就是问题所在?但是,我认为您的解决方案可能是一个不错的解决方案,因为我可以确定无论何时运行测试,我与 GMT 的偏移量都是相同的。
    • @Rob:抱歉,我误读了这个问题。我认为使用 UTC 将是一个好方法,除了你可以摆弄 NSTimeZone 方法,如 daylightSavingTimeOffsetForDate: (当时区在 DST 时通常会返回 3600),你可以将它添加到任何 NSDates需要比较。
    【解决方案2】:

    我遇到了类似的问题。最后我找到了OCMock,救了我的命。
    如果您使用Cocoapods,那就太好了!步骤如下:

    1. 编辑您的 Podfile 并添加一行以导入 OCMock。

      target 'YourProjectTests' do
          pod 'OCMock'
      end
      
    2. 在你的单元测试类中添加导入

      #import <OCMock/OCMock.h>
      
    3. 这样写你的测试用例

      - (void)testLocalTimezoneFromPDT {
          NSTimeZone* timeZone = [NSTimeZone timeZoneWithAbbreviation:@"PDT"];
          id timeZoneMock = OCMClassMock([NSTimeZone class]);
          OCMStub([timeZoneMock localTimeZone]).andReturn(timeZone);
      
          // Implement your test case
          // XCTAssertEqual(...);
      }
      

    该代码将模拟原始的 [NSTimeZone localTimeZone] 方法并返回 静态值。
    在本例中,我们从太平洋夏令时间 (PDT) [GMT-07:00] 返回时区。
    当您的班级调用[NSTimeZone localTimeZone] 时,您的班级将获得我们使用OCMock 设置的时区。

    希望这个答案对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 2017-02-16
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多