繁体   English   中英

XCTAssertEqual:如何比较NSDates?

[英]XCTAssertEqual: How to compare NSDates?

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类似的问题,必须通过将其转换为NSUInteger来解决,如此处所述

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

使用XCTAssertEqualWithAccuracy来比较浮点数

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

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

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

现在你可以失去“WithAccuracy”部分:

XCTAssertEqual(receivedDateTimeInterval, expectedDateTimeInterval, accuracy: 0.001)

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

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

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

如果您不关心比较中的小数秒,则在两个值上使用roundfloor ,或者将两者都转换为long long

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM