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时遇到了同样的问题。公认的答案也有帮助。
2014年

Answers:


169

从以下文档中XCTAssertEqual

当a1不等于a2时产生故障。此测试适用于C标量,结构和联合。

您应该使用XCTAssertEqualObjectsisEqual:内部使用)或类似的东西:

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

9
看来,如果您XCTAssertEqualObjects()两个NSString对象,它们将与isEqualToString:自动进行比较。
jollyr0ger 2015年

1
它一直-isEquals:在引擎盖下使用,但用于NSString -isEquals:执行众所周知-isEqualToString:。例如,方法的NSNumber实现-isEquals:使用-isEqualToNumber:
Ossir 2015年

3
不幸的是,尽管仍在文档中,但从Xcode 7.2开始,XCTAssertEqualObjects不再可用。
Max MacLeod

1
XCAssertEqual(a,b)在XCode 7中工作正常。此答案不再正确。
MdaG

2
XCTAssetEqualObjects在Xcode 8.0中可用,可用于比较NSString。
凯勒2013年

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)'18年

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

我们期望所有的断言调用都为真吗?我是单元测试的
新手

1
@ gomozor,XCTAssertTrue期望为TRUE,XCTAssertFalse期望为FALSE。Expect意味着通过了单元测试
yoAlex5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.