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

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

Lir*_*dav 5

我发现的最干净的方法是:

XCTAssertEqual(firstArgumentInClosure, true)
Run Code Online (Sandbox Code Playgroud)

或者,如果我想断言它是错误的:

XCTAssertEqual(firstArgumentInClosure, false)
Run Code Online (Sandbox Code Playgroud)

这不需要解开可选项。


das*_*ght 5

由于额外的状态,可选类型需要更多的精力来测试。

您可以使用XCTAssertTrue(firstArgumentInClosure ?? false)to test fortrueXCTAssertFalse(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)

现在,您的测试输出将准确识别问题,使您更轻松地调查问题。