簡體   English   中英

XCTAssertEqual 用於 Swift 中的自定義對象

[英]XCTAssertEqual for custom objects in Swift

XCode 6,測試版 5

我有這樣的單元測試:


    func testMyObjectsEqual()
    {
        //....

        XCTAssertEqual(myObject, myOtherObject, "\(myObject) and \(myOtherObject) should be equal")
    }

XCTAssertEqualObjects 在 Swift 中不再可用,因為該語言不區分標量和對象。

所以我們必須使用 XCTAssertEqual 這會導致以下錯誤:

 "Type MyObject does not conform to protocol Equatable"

我發現的唯一解決方法是從 NSObject 繼承 (MyObject) 以便我可以執行以下操作:

 XCTAssert(myObject == myOtherObject, "\(myObject) and \(myOtherObject) should be equal")

所以我的問題是:有沒有一種方法(從 beta 5 開始)將 XCTAssertEqual 用於自定義類型,而不必依賴 NSObject 或用“==”重載亂丟所有自定義類型?

如果要比較Swift中的引用,可以使用===運算符。 當您從NSObject XCTAssertEqual子類時會發生這種情況(當您使用XCTAssertEqual比較Objective-C中的XCTAssertEqual ,您正在比較引用)。

但這真的是你想要的嗎?

class MyObject {
    var name: String

    init(name: String) {
        self.name = name
    }
}

func testMyObjectsEqual() {
    let myObject = MyObject(name: "obj1")
    let myOtherObject = MyObject(name: "obj1")
    let otherReferenceToMyFirstObject = myObject

    XCTAssert(myObject === myOtherObject) // fails
    XCTAssert(myObject === otherReferenceToMyFirstObject) // passes
}

我想當你比較自定義對象時,你可能應該使它們符合Equatable協議,並在你的自定義對象相等時指定(在下面的例子中,當它們具有相同名稱時對象是相同的):

class MyObject: Equatable {
    var name: String

    init(name: String) {
        self.name = name
    }
}

func ==(lhs: MyObject, rhs: MyObject) -> Bool {
    return lhs.name == rhs.name
}

func testMyObjectsEqual()
{
    let myObject = MyObject(name: "obj1")
    let myOtherObject = MyObject(name: "obj1")

    XCTAssertEqual(myObject, myOtherObject) // passes
}

由於 Xcode 12.5 有XCTAssertIdentical

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM