如何在Swift单元测试中断言可选Bool的值?

时间:2017-10-19 19:27:47

标签: swift unit-testing optional

我有类似以下的Swift单元测试:

var firstArgumentInClosure: Bool?
someFunc { firstArgumentInClosure = $0 }
XCTAssertTrue(firstArgumentInClosure?)

我试图断言闭包被调用,第一个参数是true

这不会编译错误消息:

  

'?'必须跟着调用,成员查找或下标

我可以解决这个问题的一种方法是将断言更改为:

XCTAssertEqualTrue(firstArgumentInClosure ?? false)

有没有更简洁的方法来做到这一点?看到?? false有点奇怪。我也不想用!隐式解包可选项,因为我不希望它导致测试崩溃,我只是希望在firstArgumentInClosurenil或{false时测试失败{1}}。我还想避免任何if let来保持简洁。

同样,当我尝试使用XCTAssertFalse确保Bool?false时,我该怎么写这样的断言?

2 个答案:

答案 0 :(得分:4)

由于额外的状态,可选类型需要更多的测试工作。

您可以使用XCTAssertTrue(firstArgumentInClosure ?? false)来测试trueXCTAssertFalse(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)

这不需要展开可选项。