如何在Swift单元测试中声明可选Bool的值?
问题描述:
我有类似如下的雨燕单元测试:如何在Swift单元测试中声明可选Bool的值?
var firstArgumentInClosure: Bool?
someFunc { firstArgumentInClosure = $0 }
XCTAssertTrue(firstArgumentInClosure?)
我试图断言关闭叫的第一个参数是true
。
这不会错误消息编译:
'?'必须遵循的一个电话,成员查找,或下标
的一种方式,我可以解决这个问题是通过改变断言:
XCTAssertEqualTrue(firstArgumentInClosure ?? false)
有没有做到这一点更简洁的方式?看到?? false
有点奇怪。我也不想隐式地打开!
的可选项,因为我不想让测试崩溃,我只是想让测试失败,如果firstArgumentInClosure
是nil
或false
。我也想避免任何if let
以保持简洁。
同样,当我试图使用XCTAssertFalse
来确保Bool?
为false
时,我会如何编写这样的断言?
答
我发现最清洁的方法是:
XCTAssertEqual(firstArgumentInClosure, true)
或者,如果我想要断定这是假的:
XCTAssertEqual(firstArgumentInClosure, false)
这不需要展开可选。
答
可选类型需要更多的努力来测试,因为一个额外的状态。
您可以使用XCTAssertTrue(firstArgumentInClosure ?? false)
来测试true
和XCTAssertFalse(firstArgumentInClosure ?? true)
以测试false
。但是,这并不理想,因为它会混合因nil
而导致的故障,并且由于接收到相反的值而导致故障。
一个更好的(但更长)方法使用if let
解开结果来进行测试:
if let unwrappedFirstArg = firstArgumentInClosure {
XCTAssertFalse(unwrappedFirstArg)
} else {
XCTFail("Received nil in firstArgumentInClosure")
}
现在您的测试输出将精确地识别问题,使它更容易为你调查这个问题。
'XCTAssertEqualTrue(firstArgumentInClosure?false)'有什么问题? – Alexander
如果测试失败,则不清楚封闭是否从未被调用或封闭是否被错误的参数调用。 –