Lir*_*dav 2 unit-testing optional swift
我有一个类似于以下的 Swift 单元测试:
var firstArgumentInClosure: Bool?
someFunc { firstArgumentInClosure = $0 }
XCTAssertTrue(firstArgumentInClosure?)
Run Code Online (Sandbox Code Playgroud)
我试图断言闭包是用第一个参数调用的 true。
这不会编译并显示错误消息:
'?必须后跟调用、成员查找或下标
我可以解决此问题的一种方法是将断言更改为:
XCTAssertEqualTrue(firstArgumentInClosure ?? false)
Run Code Online (Sandbox Code Playgroud)
有没有更简洁的方法来做到这一点?看到这个有点奇怪??
false。我也不想隐式地解开可选的 with!因为我不希望它使测试崩溃,我只想让测试失败 if firstArgumentInClosureis nilor false。我也想避免任何if lets 以保持简洁。
同样,当我尝试使用XCTAssertFalsea Bool?is时,我将如何编写这样的断言false?
我发现的最干净的方法是:
XCTAssertEqual(firstArgumentInClosure, true)
Run Code Online (Sandbox Code Playgroud)
或者,如果我想断言它是错误的:
XCTAssertEqual(firstArgumentInClosure, false)
Run Code Online (Sandbox Code Playgroud)
这不需要解开可选项。
由于额外的状态,可选类型需要更多的精力来测试。
您可以使用XCTAssertTrue(firstArgumentInClosure ?? false)to test fortrue和XCTAssertFalse(firstArgumentInClosure ?? true)to test for false。然而,这并不理想,因为它混淆了由于nil接收相反值而导致的失败。
更好(但更长)的方法用于if let打开测试结果:
if let unwrappedFirstArg = firstArgumentInClosure {
XCTAssertFalse(unwrappedFirstArg)
} else {
XCTFail("Received nil in firstArgumentInClosure")
}
Run Code Online (Sandbox Code Playgroud)
现在,您的测试输出将准确识别问题,使您更轻松地调查问题。
| 归档时间: |
|
| 查看次数: |
1881 次 |
| 最近记录: |