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

问题描述 投票:0回答:4

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

据我所知

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]);
}
objective-c unit-testing xctest
4个回答
177
投票

来自

XCTAssertEqual
的文档:

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

您应该使用

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

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

15
投票

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

我有一个 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}€")

过去了。


3
投票

Objective-C 比较字符串

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

0
投票

我也遇到了同样的问题,字符串值显然不相等,并且还必须将

locale
传递到
XCAssertTrue
例如

let expected = "9,32 EUR"

let actual = formattedPrice(for: price)

let locale = Locale(identifier: "fr_FR")

XCTAssertTrue(expected.compare(actual, locale: locale) == .orderedSame)
© www.soinside.com 2019 - 2024. All rights reserved.