【问题标题】:XCTAssertEqual fails to compare two string values?XCTAssertEqual 无法比较两个字符串值?
【发布时间】:2013-10-28 03:48:59
【问题描述】:

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

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

【问题讨论】:

  • 这是一个非常合理的问题,当我第一次开始使用 XCUnit 时遇到了同样的问题。接受的答案也有帮助。

标签: objective-c unit-testing xctest


【解决方案1】:

来自XCTAssertEqual的文档:

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

你应该使用XCTAssertEqualObjects(内部使用isEqual:)或类似的东西:

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

【讨论】:

  • 看来,如果你 XCTAssertEqualObjects() 两个 NSString 对象,它们会自动与 isEqualToString: 进行比较。
  • 它一直在后台使用-isEquals:,但对于NSString -isEquals: 执行众所周知的-isEqualToString:。例如,NSNumber 实现 -isEquals: 方法使用 -isEqualToNumber:
  • 不幸的是,尽管仍在文档中,但从 Xcode 7.2 开始,XCTAssertEqualObjects 不再可用。
  • XCAssertEqual(a, b) 在 XCode 7 中工作得很好。这个答案不再正确了。
  • XCTAssetEqualObjects 在 Xcode 8.0 中可用,用于比较 NSStrings。
【解决方案2】:

我刚刚遇到了一个类似的问题,可能会对某人有所帮助。

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

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}€")

通过了。

【讨论】:

  • 这对我也有用,但必须有更好的解决方案。
【解决方案3】:

比较字符串

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

【讨论】:

  • 我们是否期望所有的断言调用都为真?我是单元测试新手
  • @gomozor,XCTAssertTrue 期望 TRUE,XCTAssertFalse 期望 FALSE。 Expect 表示单元测试通过
猜你喜欢
  • 1970-01-01
  • 2013-03-23
  • 2013-06-06
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
相关资源
最近更新 更多