web-dev-qa-db-fra.com

XCTAssertEqual ne parvient pas à comparer deux valeurs de chaîne?

J'ai ajouté un test unitaire simple pour tester mon extension de chaîne. Mais ça échoue. Qu'est-ce que je fais mal ici?

D'après ce que je sais, XCTAssertEqual teste la valeur et non l'objet lui-même?

La troisième ligne btw, dit que la chaîne est égale, mais XCTAssertEqual dit que ce n'est pas le cas.

- (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]);
}
65
Konrad77

À partir de la documentation de XCTAssertEqual:

Génère un échec lorsque a1 n'est pas égal à a2. Ce test concerne les scalaires C, les structures et les unions.

Vous devez utiliser XCTAssertEqualObjects (qui utilise isEqual: en interne) ou quelque chose comme:

XCTAssertTrue([[firstNickName initialsFromString] isEqualToString:expectedResult],
              @"Strings are not equal %@ %@", expectedResult, [firstNickName initialsFromString]);
152
Arek Holko

Je viens d'avoir un problème similaire qui pourrait aider quelqu'un.

J'ai une fonction d'extension Float qui renvoie une chaîne. Le test suivant échoue:

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

Avec le message suivant:

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

Ce qui est plutôt ennuyeux. Cependant, j'ai découvert que si je modifiais mon test pour utiliser le caractère d'espacement sans rupture unicode :

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

Ça passe.

9
Leon