XCTAssertEqual не вдається порівняти два рядкові значення?


76

Я додав простий модульний тест, щоб перевірити розширення рядка. Але це не вдається. Що я тут роблю не так?

Наскільки я знаю, XCTAssertEqualце тестування вартості, а не самого об'єкта?

Третій рядок до речі, говорить, що рядок рівний, але XCTAssertEqualговорить, що це не так.

- (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
Це було цілком розумне запитання, і я зіткнувся з тим самим питанням, коли вперше розпочав роботу з XCUnit. Прийнята відповідь також допомогла.
Michael Teper

Відповіді:


169

З документації XCTAssertEqual:

Генерує збій, коли a1 не дорівнює a2. Цей тест призначений для скалярів, структур та об'єднань.

Ви повинні використовувати XCTAssertEqualObjects(що використовує isEqual:внутрішньо) або щось на зразок:

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

9
Здається, якщо ви XCTAssertEqualObjects () два об'єкти NSString вони порівнюються з isEqualToString: автоматично.
jollyr0ger

1
Він постійно використовується -isEquals:під капотом, але для NSString -isEquals:виконання добре відомий -isEqualToString:. Наприклад, NSNumberреалізація -isEquals:методу використовує -isEqualToNumber:.
Оссір,

3
На жаль, незважаючи на те, що він все ще знаходиться в документації, станом на Xcode 7.2 XCTAssertEqualObjects більше не доступний.
Max MacLeod

1
XCAssertEqual (a, b) чудово працює в XCode 7. Ця відповідь вже не правильна.
MdaG

2
XCTAssetEqualObjects доступний у Xcode 8.0 і працює для порівняння NSStrings.
Келлер,

15

Я щойно мав подібну проблему, яка може комусь допомогти.

У мене є функція розширення Float, яка повертає рядок. Наступний тест не вдається:

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

З таким повідомленням:

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

Що досить дратує. Однак я виявив, якщо я зміню свій тест на використання символу пробілу Unicode без розривів :

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

Проходить.


Це спрацювало і для мене, але має бути краще рішення.
Beau Nouvelle

1

Порівняння рядків

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

чи очікуємо ми, що всі виклики assert дають істину? Я новачок в модульному тестуванні
гомозор

1
@gomozor, XCTAssertTrue очікуйте TRUE, XCTAssertFalse очікуйте FALSE. Очікування означає, що пройдений модульний тест
yoAlex5
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.