如何使用“is”操作符对Swift中Equalable的一致性进行单元测试

如何使用“is”操作符对Swift中Equalable的一致性进行单元测试,swift,Swift,既然我们可以使用“is”来检查协议的一致性,那么有没有一种方法可以使用“is”操作符对equalable进行单元测试?比如: struct Thing { var id: UUID } extension Thing: Equatable { static func ==(lhs: Thing, rhs: Thing) -> Bool { return lhs.id == rhs.id } } func test_ThingConformsT

既然我们可以使用“is”来检查协议的一致性,那么有没有一种方法可以使用“is”操作符对equalable进行单元测试?比如:

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)
}


这会产生协议“Equatable”只能用作一般约束,因为它具有自身或关联的类型需求,我已经阅读了关于此错误的解决方法,但“is”运算符非常干净,我想找到一种使用它进行一致性单元测试的方法。谢谢

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

也就是说,如果您愿意,可以对其进行测试,也许您正试图保护一个不直接使用的公共接口。您可以通过依赖可等式一致性来测试它,强制编译失败,如果编译依赖于可等式一致性,那么它在代码中的失败方式将完全相同

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))
}

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

也就是说,如果您愿意,可以对其进行测试,也许您正试图保护一个不直接使用的公共接口。您可以通过依赖可等式一致性来测试它,强制编译失败,如果编译依赖于可等式一致性,那么它在代码中的失败方式将完全相同

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))
}

作为一个单元测试,这没有多大意义,这正是我最初考虑的。谢谢你对我删除的答案发表评论。作为一个单元测试,这没有多大意义。这正是我最初考虑的。谢谢你对我删除的答案发表评论。关于这个测试的使用。如果测试失败,这意味着什么?那么事情就不一样了。但由于您的代码是以其他方式编译的,所以您的测试将无法运行,很明显,没有任何代码依赖于事物是可平等的,因此没有必要要求它是可平等的。关于此测试的使用。如果测试失败,这意味着什么?那么事情就不一样了。但由于您的代码是以其他方式编译的,所以您的测试将无法运行,很明显,并没有任何代码依赖于事物是可平等的,所以并没有必要要求它是可平等的。