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))
是否有不同的方法来测试元组而不提取其成员并单独测试?
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)
编辑:我已经在博客文章“ 如何在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)
| 归档时间: |
|
| 查看次数: |
943 次 |
| 最近记录: |