2015-09-10 37 views
7

鑑於以下斯威夫特類工作Equatable類型XCTAssertEqual不是斯威夫特

func testExample() { 
    let a = TestObject(a: 4) 
    let b = TestObject(a: 4) 

    XCTAssertEqual(a, b) // fails 

    let isEqual = a == b 
    XCTAssert(isEqual) // passes  
} 

兩個斷言的返回值不同,但他們應該都通。

我試着寫一個自定義的斷言功能:

func BAAssertEquatable<A: Equatable>(x1: A, _ x2: A, _ message: String, file: String = __FILE__, line: UInt = __LINE__) { 
    let operandsEqual = (x1 == x2) 
    XCTAssert(operandsEqual, message, file: file, line: line) 
} 

而且這也失敗:

BAAssertEquatable(a, b, "custom assert") // fails 

這是怎麼回事?

+0

+1爲非常好的分析。不幸的是,我只能猜測問題並推薦進一步分析。對我來說,它看起來像迅速地方失去你「的TestObject」實現Equatable協議的信息。你可以給你的操作符添加一個'打印'功能嗎?我期望它在有關案件中沒有被調用。此外,我所期待的的「FUNC ==」前面加上一個「重寫」不知何故。抱歉,我目前無法提供更好的幫助。 – jboi

+0

@jboi你說得對 - ==操作符只被調用一次(在testExample直接調用),但它應該被稱爲三次。我不能在頂層(這是一個語法錯誤)使用override關鍵字。 – Bill

+0

我認爲這是相關的bug /問題在這裏:http://stackoverflow.com/questions/31099379/bug-with-equals-operator-and-nsobjects-in-swift-2-0 – Bill

回答

3

XCTAssertEqual呼叫isEqual代替==,例如這將使你的測試通過:

class TestObject: NSObject { 

    // ... 

    override func isEqual(object: AnyObject?) -> Bool { 
     guard let other = object as? TestObject else { return false } 
     return self == other 
    } 

}