XCTAssertEqual无法比较两个字符串值?

时间:2013-10-19 08:57:27

标签: objective-c unit-testing xctest

我添加了一个简单的单元测试来测试我的字符串扩展。但它失败了。我在这里做错了什么?

据我所知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]);
}

3 个答案:

答案 0 :(得分:150)

来自XCTAssertEqual的文档:

  

当a1不等于a2时生成失败。 此测试适用于C.   标量,结构和联合。

您应该使用XCTAssertEqualObjects(内部使用isEqual:)或类似的内容:

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

答案 1 :(得分:9)

我有一个类似的问题可能有助于某人。

我有一个Float扩展函数,它返回一个字符串。以下测试失败:

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

使用以下消息:

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

这很烦人。但是我发现如果我改变我的测试以使用unicode no-break space character

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

它过去了。

答案 2 :(得分: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]);
}