2017-10-19 76 views
1

我有类似如下的雨燕单元测试:如何在Swift单元测试中声明可选Bool的值?

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

我试图断言关闭叫的第一个参数是true

这不会错误消息编译:

'?'必须遵循的一个电话,成员查找,或下标

的一种方式,我可以解决这个问题是通过改变断言:

XCTAssertEqualTrue(firstArgumentInClosure ?? false) 

有没有做到这一点更简洁的方式?看到?? false有点奇怪。我也不想隐式地打开!的可选项,因为我不想让测试崩溃,我只是想让测试失败,如果firstArgumentInClosurenilfalse。我也想避免任何if let以保持简洁。

同样,当我试图使用XCTAssertFalse来确保Bool?false时,我会如何编写这样的断言?

+0

'XCTAssertEqualTrue(firstArgumentInClosure?false)'有什么问题? – Alexander

+0

如果测试失败,则不清楚封闭是否从未被调用或封闭是否被错误的参数调用。 –

回答

0

我发现最清洁的方法是:

XCTAssertEqual(firstArgumentInClosure, true) 

或者,如果我想要断定这是假的:

XCTAssertEqual(firstArgumentInClosure, false) 

这不需要展开可选。

2

可选类型需要更多的努力来测试,因为一个额外的状态。

您可以使用XCTAssertTrue(firstArgumentInClosure ?? false)来测试trueXCTAssertFalse(firstArgumentInClosure ?? true)以测试false。但是,这并不理想,因为它会混合因nil而导致的故障,并且由于接收到相反的值而导致故障。

一个更好的(但更长)方法使用if let解开结果来进行测试:

if let unwrappedFirstArg = firstArgumentInClosure { 
    XCTAssertFalse(unwrappedFirstArg) 
} else { 
    XCTFail("Received nil in firstArgumentInClosure") 
} 

现在您的测试输出将精确地识别问题,使它更容易为你调查这个问题。