XCTAssertEqual không thể so sánh hai giá trị chuỗi?


76

Tôi đã thêm một bài kiểm tra đơn vị đơn giản để kiểm tra phần mở rộng chuỗi của mình. Nhưng nó không thành công. Tôi đang làm gì sai ở đây?

Từ những gì tôi biết XCTAssertEquallà giá trị thử nghiệm chứ không phải bản thân đối tượng?

Dòng thứ ba btw, cho biết chuỗi bằng nhau, nhưng XCTAssertEqualnói rằng chúng không.

- (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
Đây là một câu hỏi hoàn toàn hợp lý và tôi đã gặp phải vấn đề tương tự khi lần đầu tiên bắt đầu với XCUnit. Câu trả lời được chấp nhận cũng giúp ích.
Michael Teper

Câu trả lời:


169

Từ tài liệu của XCTAssertEqual:

Phát sinh lỗi khi a1 không bằng a2. Bài kiểm tra này dành cho C vô hướng, cấu trúc và liên kết.

Bạn nên sử dụng XCTAssertEqualObjects(sử dụng isEqual:nội bộ) hoặc một cái gì đó như:

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

9
Có vẻ như nếu bạn XCTAssertEqualObjects () hai đối tượng NSString, chúng được so sánh với isEqualToString: tự động.
jollyr0ger

1
Nó sử dụng ẩn -isEquals:mọi lúc, nhưng để NSString -isEquals:thực thi nổi tiếng -isEqualToString:. Ví dụ, NSNumberviệc thực hiện các -isEquals:sử dụng phương thức -isEqualToNumber:.
Ossir

3
Thật không may, mặc dù vẫn còn trong tài liệu, kể từ khi Xcode 7.2 XCTAssertEqualObjects không còn khả dụng.
Max MacLeod

1
XCAssertEqual (a, b) hoạt động tốt trong XCode 7. Câu trả lời này không còn đúng nữa.
MdaG

2
XCTAssetEqualObjects có sẵn trong Xcode 8.0 và hoạt động để so sánh các NSStrings.
Keller

15

Tôi vừa gặp một vấn đề tương tự có thể giúp ích cho ai đó.

Tôi có một hàm mở rộng Float trả về một chuỗi. Kiểm tra sau không thành công:

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

Với thông báo sau:

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

Đó là khá khó chịu. Tuy nhiên, tôi đã phát hiện ra nếu tôi thay đổi thử nghiệm của mình để sử dụng ký tự khoảng trắng không ngắt unicode :

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

Nó đi.


Điều này cũng hiệu quả với tôi, nhưng phải có một giải pháp tốt hơn.
Beau Nouvelle

1

So sánh các chuỗi

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

chúng tôi mong đợi tất cả các cuộc gọi xác nhận kết quả là true? Tôi mới tham gia thử nghiệm đơn vị
gomozor

1
@gomozor, XCTAssertTrue kỳ vọng ĐÚNG, XCTAssertFalse kỳ vọng SAI. Kỳ vọng có nghĩa là bài kiểm tra đơn vị đã được vượt qua
yoAlex5
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.