XCTAssertEqual fails to compare two string values?

I added a simple unit test to test my string extension. But it fails. What I am I doing wrong here?

From what I know XCTAssertEqual is testing value and not the object itself?

The third line btw, says the string are equal, but XCTAssertEqual says they're not.

- (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]);
}
40877 次浏览

From the documentation of XCTAssertEqual:

Generates a failure when a1 is not equal to a2. This test is for C scalars, structs and unions.

You should use XCTAssertEqualObjects (which uses isEqual: internally) or something like:

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

I've just had a similar issue which might help someone.

I have a Float extension function which returns a string. The following test fails:

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

With the following message:

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

Which is rather annoying. However I discovered if I change my test to use the unicode no-break space character:

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

It passes.

Comparing strings

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