XCTAssertEqual Fehler: ("3") ist nicht gleich ("3")
NSMutableArray *arr = [NSMutableArray array];
[arr addObject:@"1"];
[arr addObject:@"2"];
[arr addObject:@"3"];
//This statement is fine.
XCTAssertTrue(arr.count == 3, @"Wrong array size.");
//This assertion fails with an error: ((arr.count) equal to (3)) failed: ("3") is not equal to ("3")
XCTAssertEqual(arr.count, 3, @"Wrong array size.");
Was ich nicht verstehe, über XCTAssertEqual? Warum hat die Letzte Behauptung nicht?
InformationsquelleAutor der Frage Sergey | 2013-10-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte auch ziemliche Probleme mit der Xcode-5-tests. Es scheint noch ziemlich buggy mit einigen seltsamen Verhalten - allerdings habe ich die definitive Grund Ihrer besonderen
XCTAssertEqual
funktioniert nicht.Wenn wir einen Blick auf den test-code, den wir sehen es eigentlich die folgende (entnommen direkt aus
XCTestsAssertionsImpl.h
- es kann einfacher sein, zu sehen):Hier ist das problem:
Was der test tatsächlich tun wird, die Codierung der Werte in eine
NSValue
und dann vergleichen. "Okay", werden Sie sagen, "aber was ist das problem?" Ich glaube nicht, es war ein, bis ich meinen eigenen test-Fall für Sie. Das problem ist, dass NSValue ist-isEqualToValue
muss auch vergleichen Sie die NSValue ist Codierung sowie den tatsächlichen Wert. Beide muss gleich für die Methode zurückYES
.In deinem Fall
arr.count
ist einNSUInteger
ist ein typedef vonunsigned int
. Der compile-Zeit-Konstante3
vermutlich artetsigned int
zur Laufzeit. Also, wenn die beiden setzen sich in einNSValue
Objekt, Ihre encoding-Typen nicht gleich sind und somit die beiden NICHT gleich nach-[NSValue isEqualToValue]
.Können Sie beweisen dies mit einem custom-Beispiel. Der folgende code explizit macht genau das, was
XCTAssertEqual
:"3 != 3 :("
erscheint im log jedes mal.Ich beeile mich hinzuzufügen, dass dies in der Tat zu erwartende Verhalten.
NSValue
ist soll zu überprüfen, die Art der Codierung, wenn dabei Vergleiche. Es ist halt leider nicht das, was wir erwartet hatten beim testen zwei ('equal') Ganzzahlen.XCTAssertTrue
hat übrigens viel einfacher Logik, und verhält sich im Allgemeinen wie erwartet (wieder, siehe die eigentliche Quelle dafür, wie es bestimmt, ob die assertion fehlschlägt).InformationsquelleAutor der Antwort Ephemera
Hatte ich dieses problem auch. @Ephemera und @napier angegeben, dies ist eine Typ Problem.
Kann es gelöst werden, indem Sie einen Wert des richtigen Typs, mit dem c-literal Modifikatoren.
Finden Sie die richtige Art von sucht, bis Sie den Rückgabetyp der Funktion auf der linken Seite -
ALT-click
auf arr.count
:Nun ALT-klicken Sie auf
NSUInteger
finden Sie Ihren Typ:Nun die c-literal numerisches format für unsigned long - google ist ein guter Freund, aber diese Seite funktioniert:
http://www.tutorialspoint.com/cprogramming/c_constants.htm
Als quick-Tipp hier ist, müssen Sie möglicherweise die Verwendung von U (unsigned) L (lang) oder F (float), und stellen Sie sicher, Sie schreiben 1.0 statt 1 um eine doppelte. Kleinbuchstaben funktioniert auch, wie in meinem Beispiel oben.
InformationsquelleAutor der Antwort Alex Brown
Den Fall, dass jemand anderes auf der Suche nach dem Problem führen von Doppel-Vergleich wie mich (die Lösung oben funktioniert nicht für Schwimmer & doppelt), versuchen:
InformationsquelleAutor der Antwort Kjuly
Eine alternative ist, um Sie nur casting:
Es ist die beste Lösung mit dem aktuellen Zustand der Werkzeuge, vor allem, wenn Sie code haben wo Sie sind mit
XCTAssertEqual
viel und nicht wechseln wollen, zuXCTAssertTrue
.(Ich bemerkte, @RobNapier diesen Vorschlag machte in einem Kommentar.)
InformationsquelleAutor der Antwort ThomasW
Bekam ich hat von diesem Problem auch sehr dankbar für die workarounds, die hier bereitgestellt werden.
Schnelle FYI, es scheint, dass das gefixt wurde Xcode 5.1 Version.
https://developer.apple.com/library/mac/releasenotes/DeveloperTools/RN-Xcode/xc5_release_notes/xc5_release_notes.html
Habe ich noch nicht aktualisiert von Xcode 5.0.2 aber mein Kollege hat, und das gleiche XC-tests, die zuvor nicht wegen diesem problem sind nun vorbei, ohne das casting Abhilfe.
InformationsquelleAutor der Antwort Todd Patterson