XCTAssertEqual:如何比较NSDates?

时间:2013-11-04 20:48:39

标签: ios unit-testing ios7 xctest

NSDate *date = [NSDate date];
XCTAssertEqual([[store selectedDate] timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate]);

这给了我错误信息:

(([[store selectedDate] timeIntervalSinceReferenceDate]) equal to ([date timeIntervalSinceReferenceDate])) failed: 
("405290648.294") is not equal to ("405290648.294")

我之前遇到过与Integers类似的问题,必须按照here.

所述将其转换为NSUInteger来解决

但是我无法弄清楚如何用NSDate对象/双打来解决这个问题(如本例所示)。

5 个答案:

答案 0 :(得分:30)

使用XCTAssertEqualWithAccuracy来比较浮点数

XCTAssertEqualWithAccuracy([[store selectedDate] timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate], 0.001);

答案 1 :(得分:3)

在早期的Swift中你需要使用它:

let receivedDateTimeInterval = receivedDate.timeIntervalSinceReferenceDate
let expectedDateTimeInterval = expectedDate.timeIntervalSinceReferenceDate
XCTAssertEqualWithAccuracy(receivedDateTimeInterval, expectedDateTimeInterval, accuracy: 0.001)

现在你可以失去" WithAccuracy"部分:

XCTAssertEqual(receivedDateTimeInterval, expectedDateTimeInterval, accuracy: 0.001)

答案 2 :(得分:1)

这应该有效,应该足以进行测试。

XCTAssertEqualWithAccuracy([refDate timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate],0.00001,@"");

答案 3 :(得分:0)

问题在于,两个double值可能会比断言中显示的更多有效数字(可能是405290648.2942405290648.2941)有所不同。

如果您不关心比较中的小数秒数,那么请对这两个值使用roundfloor,或将两者都投放到long long

答案 4 :(得分:0)

如果您运行简单测试,您会发现值不同。它们在断言输出中看起来相同的事实很可能与日志输出的构建方式有关。

NSDate *date  = [NSDate date];
NSDate *date2 = [NSDate date];

NSLog(@"%f %f", [date2 timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate]); //=> 405292099.192900 405292099.192899

XCTAssertEqual([date2 timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate]);

您应该使用XCTAssertEqualWithAccuracy,因为它们基本上是double