给出以下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)
这里发生了什么?
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)