我有类似以下的Swift单元测试:
var firstArgumentInClosure: Bool?
someFunc { firstArgumentInClosure = $0 }
XCTAssertTrue(firstArgumentInClosure?)
我试图断言闭包被调用,第一个参数是true
。
这不会编译错误消息:
'?'必须跟着调用,成员查找或下标
我可以解决这个问题的一种方法是将断言更改为:
XCTAssertEqualTrue(firstArgumentInClosure ?? false)
有没有更简洁的方法来做到这一点?看到??
false
有点奇怪。我也不想用!
隐式解包可选项,因为我不希望它导致测试崩溃,我只是希望在firstArgumentInClosure
为nil
或{false
时测试失败{1}}。我还想避免任何if let
来保持简洁。
同样,当我尝试使用XCTAssertFalse
确保Bool?
为false
时,我该怎么写这样的断言?
答案 0 :(得分:4)
由于额外的状态,可选类型需要更多的测试工作。
您可以使用XCTAssertTrue(firstArgumentInClosure ?? false)
来测试true
和XCTAssertFalse(firstArgumentInClosure ?? true)
来测试false
。但是,这并不理想,因为它会因nil
导致的失败而导致由于接收到相反的值而导致失败。
更好(但更长)的方法使用if let
来打开测试结果:
if let unwrappedFirstArg = firstArgumentInClosure {
XCTAssertFalse(unwrappedFirstArg)
} else {
XCTFail("Received nil in firstArgumentInClosure")
}
现在,您的测试输出可以准确识别问题,使您更容易调查问题。
答案 1 :(得分:1)
我发现最干净的方法是:
XCTAssertEqual(firstArgumentInClosure, true)
或者,如果我想断言它是假的:
XCTAssertEqual(firstArgumentInClosure, false)
这不需要展开可选项。