Objective c 使NSTimeZone在单元测试中无故障
在Objective-C中对日历代码进行单元测试的问题是:时区包含有关夏令时的信息,因此您在夏季编写测试,预计6月10日的日出时间为上午6:02。您的测试通过了,稍后,您正在运行测试,但测试不是DST,并且出现故障,因为当您获得时区时,daylightsavings将关闭 似乎没有简单的方法告诉它在dst开启时给你时区 我想做一个分类,这样我就可以拦截时区呼叫,但这听起来非常混乱,因为我不知道你在操纵什么日期Objective c 使NSTimeZone在单元测试中无故障,objective-c,date,date-math,Objective C,Date,Date Math,在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
,那就太棒了!以下是步骤:
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(...);
}