Objective c 使NSTimeZone在单元测试中无故障

Objective c 使NSTimeZone在单元测试中无故障,objective-c,date,date-math,Objective C,Date,Date Math,在Objective-C中对日历代码进行单元测试的问题是:时区包含有关夏令时的信息,因此您在夏季编写测试,预计6月10日的日出时间为上午6:02。您的测试通过了,稍后,您正在运行测试,但测试不是DST,并且出现故障,因为当您获得时区时,daylightsavings将关闭 似乎没有简单的方法告诉它在dst开启时给你时区 我想做一个分类,这样我就可以拦截时区呼叫,但这听起来非常混乱,因为我不知道你在操纵什么日期 当然,我可以编写所有测试来检查时区设置,然后改变所有期望值,但这听起来是最糟糕的选择。

在Objective-C中对日历代码进行单元测试的问题是:时区包含有关夏令时的信息,因此您在夏季编写测试,预计6月10日的日出时间为上午6:02。您的测试通过了,稍后,您正在运行测试,但测试不是DST,并且出现故障,因为当您获得时区时,daylightsavings将关闭

似乎没有简单的方法告诉它在dst开启时给你时区

我想做一个分类,这样我就可以拦截时区呼叫,但这听起来非常混乱,因为我不知道你在操纵什么日期


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

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

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

您只需提供UTC偏移量作为名称即可实现这一点:

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

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

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

  • 编辑Podfile并添加要导入OCMock的行

    target 'YourProjectTests' do
        pod 'OCMock'
    end
    
  • 在单元测试类中添加导入

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


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

    不是我不感兴趣,而是它会给我今天测试运行时的DST设置,而不是测试日期。这就是问题所在?然而,我认为你的解决方案可能是一个很好的解决方案,因为我可以确定,无论何时进行测试,我与GMT的偏移量都是相同的。@Rob:噢,对不起,我误读了这个问题。我认为使用UTC将是一个很好的方法,除了您可以随意使用
    NSTimeZone
    方法,例如
    daylightSavingTimeOffsetForDate:
    (当时区位于DST时通常返回3600),您可以将其添加到任何需要比较的NSDate中。
    - (void)testLocalTimezoneFromPDT {
        NSTimeZone* timeZone = [NSTimeZone timeZoneWithAbbreviation:@"PDT"];
        id timeZoneMock = OCMClassMock([NSTimeZone class]);
        OCMStub([timeZoneMock localTimeZone]).andReturn(timeZone);
    
        // Implement your test case
        // XCTAssertEqual(...);
    }