如何使用'is'运算符对Swift中的Equatable一致性进行单元测试

时间:2019-05-16 20:44:50

标签: swift

由于我们可以使用'is'来检查协议一致性,是否有一种方法可以使用'is'运算符对Equatable进行单元测试一致性?像这样:

struct Thing {
    var id: UUID
}

extension Thing: Equatable {
    static func ==(lhs: Thing, rhs: Thing) -> Bool {
        return lhs.id == rhs.id
    }
}



func test_ThingConformsToEquatable() {
    let thing1 = Thing(id: UUID())
    XCTAssert(thing1 is Equatable)
}

这将产生“ Protocol'Equatable'只能用作通用约束,因为它具有Self或关联的类型要求”,并且我已经阅读了有关SO上此错误的解决方法,但是'is'运算符非常干净,并且我想找到一种使用它进行单元测试一致性的方法。谢谢!

1 个答案:

答案 0 :(得分:4)

通常,这对于单元测试没有多大意义。如果您在代码中依赖Equatable,那么如果类型不是Equatable,则代码将无法编译。如果您在代码中不依赖Equatable,则类型是否为Equatable并不重要。

也就是说,如果愿意,可以对此进行测试,也许您是在尝试保护不直接使用的公共接口。您可以依靠Equatable一致性来测试它,如果编译依赖Equatable一致性,则迫使编译完全失败,从而使编译失败。

func isEquatable<T: Equatable>(_: T) -> Bool {
    return true
}

func test_ThingConformsToEquatable() {
    let thing1 = Thing(id: UUID())
    XCTAssert(isEquatable(thing1))
}

此测试用例的优点在于,如果失败,则测试套件甚至不会编译,因此您将立即发现错误。

您还可以跳过创建实例的过程,而直接直接测试类型:

func isEquatable<T: Equatable>(_: T.Type) -> Bool {
    return true
}

func test_ThingConformsToEquatable() {
    XCTAssert(isEquatable(Thing.self))
}