2013-11-04 11 views
15
NSDate *date = [NSDate date]; 
XCTAssertEqual([[store selectedDate] timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate]); 

Das gibt mir die Fehlermeldung:XCTAssertEqual: Wie NSDates zu vergleichen?

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

ich mit ganzen Zahlen vorheriges hatte ein ähnliches Problem, das durch Gießen es NSUInteger wie here.

zu lösen hatte, aber ich konnte nicht verstehen heraus, wie man das mit NSDate-Objekten löst/verdoppelt (wie in diesem Fall).

Antwort

28

Verwendung XCTAssertEqualWithAccuracy vergleichen Zahlen

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

Danke:

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

Jetzt können Sie die "WithAccuracy" Teil verlieren! In Swift können Sie dies jetzt ohne den "WithAccuracy" -Teil verwenden. Fügen Sie einfach den Parameter "Genauigkeit" am Ende hinzu. – Corneliu

0

Das Problem ist, dass die beiden double Werte wahrscheinlich um eine mehr signifikante Ziffer als in der Assertion angezeigt wird (vielleicht 405290648.2942 vs. 405290648.2941).

Wenn Sie im Vergleich keine Bruchteile von Sekunden benötigen, dann verwenden Sie round oder floor für beide Werte oder werfen Sie beide zum Beispiel auf long long.

0

Floating Wenn Sie einen einfachen Test laufen Sie, dass die Werte unterschiedlich sind zu sehen. Die Tatsache, dass sie in der Assertion-Ausgabe gleich aussehen, hängt am ehesten mit der Art zusammen, wie die Protokollausgabe erstellt wird.

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

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

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

Sie sollten XCTAssertEqualWithAccuracy verwenden, da diese im Wesentlichen double Werte

1

Dies sollte funktionieren, und sollte für den Test ausreichend.

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

In früheren Swift benötigt man diese verwenden:

XCTAssertEqual(receivedDateTimeInterval, expectedDateTimeInterval, accuracy: 0.001)