如何单元调用NSDate()的测试方法?

问题描述 投票:4回答:2

我目前正在使用Swift。

我的问题很简单,你如何使用NSDate()作为属性来单元测试在数据库中创建对象的方法?

问题是,在我的断言中,我将创建一个新的NSDate(),如下所示:

let expectedObject = Object(data: NSDate())
XCTAssertEqual(database.objects(), [expectedObject])

并且断言将失败,因为2个NSDates略有不同。

谢谢。

ios unit-testing swift nsdate
2个回答
0
投票

一个简单的解决方法是使用以下方法:

  1. 创建一个派生自被测试类的模拟类。
  2. 在被测试的类中添加类似“getDate() - > NSDate”的方法,返回“NSDate()” - 或者预期的任何值。
  3. 覆盖mockClass中的getDate()。您还可以在模拟类中创建一个从getDate()返回的变量。有了这个,您将能够从测试中提供您想要的任何日期。
  4. 最后,不是创建要测试的类实例,而是在测试中创建mock类的实例。

0
投票

正如https://testdriven-ios.com所指出的那样

一个非常好的方法是在测试用例中覆盖NSDate.date,强制它返回一个已知日期

@implementation NSDate (custom)

+ (instancetype)date{
    NSDateFormatter* formatter = NSDateFormatter.new;
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ssZZZ"];
    return [formatter dateFromString:@"2017-12-28 13:00:10+0000"];
}

@end

然后在任何调用NSDate.date的地方,将返回2017-12-28 13:00:10+0000

@implementation NSDate (custom)

+ (instancetype)date{
    NSDateFormatter* formatter = NSDateFormatter.new;
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ssZZZ"];
    return [formatter dateFromString:theDate];
}

@end

您甚至可以使用静态date变量进一步自定义它,然后在测试中对其进行修改

-(void) test_something_out {
 theDate = @"2017-12-28 13:00:10+0000";
 //Test any function that uses nsdate.date
}
© www.soinside.com 2019 - 2024. All rights reserved.