XCTAssertEqual: Как сравнить 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")

У меня была предыдущая аналогичная проблема с целыми числами, которую пришлось решить, переведя ее на NSUInteger, как описано здесь.

Но я не мог понять, как это решить с объектами/удвоениями NSDate (как в этом случае).

Ответ 1

используйте XCTAssertEqualWithAccuracy для сравнения плавающих чисел

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

Ответ 2

Это должно работать и должно быть достаточным для теста.

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

Ответ 3

Проблема в том, что два значения double, вероятно, отличаются на еще одну значащую цифру, чем показано в утверждении (возможно, 405290648.2942 vs. 405290648.2941).

Если вам не нужны дробные секунды в сравнении, используйте round или floor для обоих значений или, например, приведите их как к long long.

Ответ 4

Если вы запустите простой тест, вы увидите, что значения разные. Тот факт, что они выглядят одинаково на выходе утверждения, скорее всего, будет связан с тем, как построен выход журнала.

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

Ответ 5

В предыдущем Swift вам нужно было использовать это:

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

Теперь вы можете потерять часть "WithAccuracy":

XCTAssertEqual(receivedDateTimeInterval, expectedDateTimeInterval, accuracy: 0.001)