2013-10-19 5 views
56

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

Von was ich weiß XCTAssertEqual testet Wert und nicht das Objekt selbst?

Die dritte Zeile BTW, sagt die Zeichenfolge sind gleich, aber XCTAssertEqual sagt, sie sind nicht.

- (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]); 
} 
+2

Das war eine vollkommen vernünftige Frage, und ich stieß auf das gleiche Problem, als ich mit XCUnit anfing. Die angenommene Antwort half auch. –

Antwort

135

Aus der Dokumentation von XCTAssertEqual:

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

sollten Sie verwenden XCTAssertEqualObjects (benutzt isEqual: intern) oder so etwas wie:

XCTAssertTrue([[firstNickName initialsFromString] isEqualToString:expectedResult], 
       @"Strings are not equal %@ %@", expectedResult, [firstNickName initialsFromString]); 
+0

Danke. Ich habe diese Antwort akzeptiert! – Konrad77

+4

Es scheint, dass wenn Sie XCTAssertEqualObjects() zwei NSString Objekte mit IsEqualToString verglichen werden: automatisch. – jollyr0ger

+0

Es verwendet '-isEquals:' unter der Haube die ganze Zeit, aber für 'NSString'' -isEquals: 'führt wohlbekannte' -isEqualToString: '. Zum Beispiel verwendet 'NSNumber' die Implementierung von' -isEquals: 'Methode verwendet' -isEqualToNumber: '. – Ossir

5

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

Ich habe eine Float-Erweiterungsfunktion, die eine Zeichenfolge zurückgibt. Der folgende Test fehlschlägt:

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

mit der folgenden Meldung:

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

Welche eher lästig ist. Allerdings entdeckte ich, wenn ich meinen Test die unicode no-break space character verwenden ändern:

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

Es geht.

+0

Definitiv hat mir geholfen, danke !! –