由于我们可以使用'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'运算符非常干净,并且我想找到一种使用它进行单元测试一致性的方法。谢谢!
答案 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))
}