XCTAssertEqual不适用于Swift中的Equatable类型

Bil*_*ill 9 xctest swift

给出以下Swift类:

class TestObject: NSObject {
    let a: Int

    init(a: Int) {
        self.a = a
        super.init()
    }
}

func ==(lhs: TestObject, rhs: TestObject) -> Bool {
    return lhs.a == rhs.a
}
Run Code Online (Sandbox Code Playgroud)

以及它的测试用例:

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

    XCTAssertEqual(a, b) // fails

    let isEqual = a == b
    XCTAssert(isEqual) // passes       
}
Run Code Online (Sandbox Code Playgroud)

两个断言返回不同的值,但它们都应该通过.

我尝试编写自定义断言函数:

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)
}
Run Code Online (Sandbox Code Playgroud)

但这也失败了:

BAAssertEquatable(a, b, "custom assert") // fails
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

Rud*_*vič 5

XCTAssertEqual调用isEqual代替==,例如,这将使您的测试通过:

class TestObject: NSObject {

    // ...

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

}
Run Code Online (Sandbox Code Playgroud)