XCTest'ing 一个元组

XCTest'ing a tuple

我正在尝试构建这样的单元测试:

// region is a (Double, Double) tuple
XCTAssertEqual(region, (0.0, 200.0))

但是 Xcode 给我一个错误:Cannot invoke 'XCTAssertEqual' with an argument list of type ((Double, Double), (Double, Double))

是否有其他方法可以在不提取元组成员并单独测试的情况下测试元组?

XCTAssertEqual要求传给它的两个参数是Equatable,从方法签名可以看出。注意 expression1 returns T?T 必须是 Equatable:

func XCTAssertEqual<T : Equatable>(_ expression1: @autoclosure () throws -> T?, _ expression2: @autoclosure () throws -> T?, _ message: @autoclosure () -> String = default, file: StaticString = #file, line: UInt = #line)

但是 Swift tuples aren't Equatable,所以你不能将它们与 XCTAssertEqual 一起使用。

元组 do 有一个 == 方法——它们只是不符合协议——所以你可以这样做:

let eql = region == (0.0, 200.0)
XCTAssertTrue(eql)

甚至:

XCTAssertTrue(region == (0.0, 200.0))

编辑:我在博客 post、How to Make Specialized Test Assertions in Swift

中对这个答案进行了扩展

使用

的缺点
XCTAssertTrue(region == (0.0, 200.0))

它在失败时给出的报告不充分:

XCTAssertTrue failed -

现在您必须追踪实际值是什么,以了解哪里出了问题。

但是您可以像这样向断言添加诊断信息:

XCTAssertTrue(region == (0.0, 200.0), "was \(region)")

例如:

XCTAssertTrue failed - was (1.0, 2.0)

如果您计划进行多个测试来比较这个元组,我不想在所有地方都重复这个。相反,创建一个自定义断言:

private func assertRegionsEqual(actual: (_: Double, _: Double), expected: (_: Double, _: Double), file: StaticString = #file, line: UInt = #line) {
    if actual != expected {
        XCTFail("Expected \(expected) but was \(actual)", file: file, line: line)
    }
}

现在测试断言是

assertRegionsEqual(actual: region, expected: (0.0, 200.0))

失败时,会产生类似

的消息

failed - Expected (0.0, 200.0) but was (1.0, 2.0)