XCTest是一个元组

GWR*_*uez 8 xcode tuples xctest swift

我正在尝试构建一个单元测试:

// region is a (Double, Double) tuple
XCTAssertEqual(region, (0.0, 200.0))
Run Code Online (Sandbox Code Playgroud)

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

是否有不同的方法来测试元组而不提取其成员并单独测试?

Aar*_*ger 8

XCTAssertEqual要求传递给它的两个参数Equatable,您可以从方法签名中看到.注意expression1返回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)
Run Code Online (Sandbox Code Playgroud)

Swift元组不是Equatable,所以你不能使用它们XCTAssertEqual.

元组确实有一个==方法 - 它们只是不符合协议 - 所以你可以做这样的事情:

let eql = region == (0.0, 200.0)
XCTAssertTrue(eql)
Run Code Online (Sandbox Code Playgroud)

甚至:

XCTAssertTrue(region == (0.0, 200.0))
Run Code Online (Sandbox Code Playgroud)


Jon*_*eid 5

编辑:我已经在博客文章“ 如何在Swift中进行专门的测试断言”中扩展了此答案

使用的缺点

XCTAssertTrue(region == (0.0, 200.0))
Run Code Online (Sandbox Code Playgroud)

失败时提供的报告不足:

XCTAssertTrue失败-

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

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

XCTAssertTrue(region == (0.0, 200.0), "was \(region)")
Run Code Online (Sandbox Code Playgroud)

例如:

XCTAssertTrue失败-是(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)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在测试断言是

assertRegionsEqual(actual: region, expected: (0.0, 200.0))
Run Code Online (Sandbox Code Playgroud)

失败时,会产生类似

失败-预期为(0.0,200.0)但为(1.0,2.0)