3

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

似乎没有一种简单的方法来告诉它给你打开 dst 的时区?

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

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

4

2 回答 2

2

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

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

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

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

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

于 2013-01-16T23:39:03.533 回答
1

我遇到了类似的问题。最后我找到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

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

于 2016-09-16T03:26:35.943 回答