26
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")

我以前遇到过与整数类似的问题,必须通过将其转换NSUInteger此处所述来解决。

但我不知道如何用 NSDate 对象/双打来解决这个问题(如本例所示)。

4

5 回答 5

35

用于XCTAssertEqualWithAccuracy比较浮点数

XCTAssertEqualWithAccuracy([[store selectedDate] timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate], 0.001);
于 2013-11-04T21:08:32.000 回答
5

在早期的 Swift 中,你需要使用这个:

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

现在您可以丢失“WithAccuracy”部分:

XCTAssertEqual(receivedDateTimeInterval, expectedDateTimeInterval, accuracy: 0.001)
于 2018-01-11T08:52:55.130 回答
1

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

XCTAssertEqualWithAccuracy([refDate timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate],0.00001,@"");
于 2013-11-04T21:16:20.797 回答
0

问题在于,这两个double值可能在比断言中显示的高一位上有所不同(可能是405290648.2942vs. 405290648.2941)。

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

于 2013-11-04T21:08:12.530 回答
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

于 2013-11-04T21:11:39.090 回答