簡體   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