XCTAssertEqual kann zwei Zeichenfolgenwerte nicht vergleichen?

76

Ich habe einen einfachen Unit-Test hinzugefügt, um meine String-Erweiterung zu testen. Aber es scheitert. Was mache ich hier falsch?

Soweit ich weiß, XCTAssertEqualist der Testwert und nicht das Objekt selbst?

Die dritte Zeile sagt übrigens, dass die Zeichenfolge gleich ist, aber XCTAssertEqualnicht.

- (void) testInitialsFromFullname {
    NSString *firstNickName = @"Mike Kain";
    NSString *expectedResult = @"MK";
    NSLog(@"Equal:%@", [[firstNickName initialsFromString] isEqualToString:expectedResult] ? @"YES" : @"NO");

    XCTAssertEqual(expectedResult, [firstNickName initialsFromString], @"Strings are not equal %@ %@", expectedResult, [firstNickName initialsFromString]);
}
Konrad77
quelle
2
Dies war eine völlig vernünftige Frage, und ich stieß auf dasselbe Problem, als ich zum ersten Mal mit XCUnit anfing. Die akzeptierte Antwort half auch.
Michael Teper

Antworten:

169

Aus der Dokumentation von XCTAssertEqual:

Erzeugt einen Fehler, wenn a1 nicht gleich a2 ist. Dieser Test ist für C-Skalare, Strukturen und Gewerkschaften.

Sie sollten verwenden XCTAssertEqualObjects(die isEqual:intern verwendet) oder etwas wie:

XCTAssertTrue([[firstNickName initialsFromString] isEqualToString:expectedResult],
              @"Strings are not equal %@ %@", expectedResult, [firstNickName initialsFromString]);
Arek Holko
quelle
9
Wenn Sie zwei NSString-Objekte mit XCTAssertEqualObjects () versehen, werden diese anscheinend automatisch mit isEqualToString verglichen:
jollyr0ger
1
Es wird -isEquals:die ganze Zeit unter der Haube verwendet , aber für NSString -isEquals:Ausführungen bekannt -isEqualToString:. Zum Beispiel die NSNumberImplementierung von -isEquals:Methodenverwendungen -isEqualToNumber:.
Ossir
3
Leider ist XCTAssertEqualObjects ab Xcode 7.2 nicht mehr verfügbar, obwohl es noch in den Dokumenten enthalten ist.
Max MacLeod
1
XCAssertEqual (a, b) funktioniert in XCode 7 einwandfrei. Diese Antwort ist nicht mehr korrekt.
MdaG
2
XCTAssetEqualObjects ist in Xcode 8.0 verfügbar und dient zum Vergleichen von NSStrings.
Keller
15

Ich hatte gerade ein ähnliches Problem, das jemandem helfen könnte.

Ich habe eine Float-Erweiterungsfunktion, die einen String zurückgibt. Der folgende Test schlägt fehl:

testValue = 0.01
XCTAssertEqual(testValue.formattedForCost(), "0,01 €")

Mit folgender Meldung:

Assertions: XCTAssertEqual failed: ("Optional("0,01 €")") is not equal to ("Optional("0,01")")

Welches ist ziemlich nervig. Ich habe jedoch festgestellt, dass ich meinen Test so ändere, dass das Unicode-Zeichen ohne Unterbrechung verwendet wird :

XCTAssertEqual(testValue.formattedForCost(), "0,01\u{00a0}€")

Es geht vorbei.

Leon
quelle
Das hat auch bei mir funktioniert, aber es muss eine bessere Lösung geben.
Beau Nouvelle
1

Zeichenfolgen vergleichen

- (void) testStringComparison {

    NSString *first = @"my string";
    NSString *second = @"my string";

    NSMutableString *firstMutable = [NSMutableString stringWithString:first];

    //== comparing addresses of the objects(pointer comparison)
    //`first` and `second` has the same address it is a compiler optimization to store only one copy
    XCTAssertTrue(first == second);
    XCTAssertFalse(first == firstMutable);

    XCTAssertEqual(first, second);
    XCTAssertNotEqual(first, firstMutable);
    XCTAssertEqualObjects(first, firstMutable);
    XCTAssertTrue([first isEqualToString:firstMutable]);
}
yoAlex5
quelle
Erwarten wir, dass alle Assert-Aufrufe zu true führen? Ich bin neu im Unit-Test
Gomozor
1
@gomozor, XCTAssertTrue erwarten TRUE, XCTAssertFalse erwarten FALSE. Erwarten bedeutet, dass ein
Komponententest