swift - XCTAssertEqual 不适用于 Swift 中的 Equatable 类型

标签 swift xctest

给定以下 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
}

及其测试用例:

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

这是怎么回事?

最佳答案

XCTAssertEqual 调用 isEqual 而不是 ==,例如这将使您的测试通过:

class TestObject: NSObject {

    // ...
    
    override public func isEqual(_ object: Any?) -> Bool {
        guard let other = object as? TestObject else { return false }
        return self == other
    }
    
}

关于swift - XCTAssertEqual 不适用于 Swift 中的 Equatable 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32500821/

相关文章:

ios - 无法在 Swift 的 ViewController 类中创建子类的对象

ios - CLLocationManager 委托(delegate)方法没有被调用(谷歌地图已集成)

ios - 等待要在下一次分派(dispatch)时执行的 block 如何成功?

ios - XCTest:传递函数参数

ios - 用于 UITest 的简单 XCTest 总是失败?

ios - 在 XCTests 中使用 [NSOperationQueue mainQueue]

ios - 以编程方式关闭弹出 View

objective-c - 从 Objective-C 到 Swift 的代码转换

Swift - 无法将类型 '__NSCFString' 的值转换为 'NSDictionary'

ios - 如何在测试期间应用程序初始化之前清除 IOS 钥匙串(keychain)