Swift:XCTest 会修改状态吗?可以返回可选值的测试函数的约定是啥?
Posted
技术标签:
【中文标题】Swift:XCTest 会修改状态吗?可以返回可选值的测试函数的约定是啥?【英文标题】:Swift: Will XCTest modify state? And what is the convention of testing functions that could return optional values?Swift:XCTest 会修改状态吗?可以返回可选值的测试函数的约定是什么? 【发布时间】:2015-01-17 16:52:56 【问题描述】:这里有两个问题:
XCTAssertEqual
函数和其他断言函数会修改程序的状态吗?我的意思是,例如,会像
XCTAssertEqual(queue.dequeue(), ..., ...)
改变队列的状态? Swift(或者可能是一般的编程语言)是否会将队列的状态恢复到执行此语句之前的状态?
为可能返回可选值的函数编写测试的推荐方法是什么?例如,我有一个方法 dequeue
,作为 Queue 类的一部分,它可以返回一个值,如果队列为空,则为 nil
。
我应该这样做(这里的想法是打开可选值):
XCTAssertEqual(queue.dequeue()!, ..., ...)
或者:
if let item = queue.dequeue()
XCTAssertEqual(item, ..., ...)
或者可能是其他测试方式。
提前感谢您的帮助。
【问题讨论】:
【参考方案1】:是的,如果您调用改变对象/变量状态的方法,那么使用此函数作为参数宏之一调用XCTAssert...
将导致状态改变方法被调用,从而导致伴随状态变化。不,这里没有任何东西可以恢复状态。
通常情况下,如果涉及状态更改,我们中的许多人会将结果分配给一个变量,然后测试该变量(也可能测试状态更改):
let returnCode = object.changeState()
XCTAssertEqual(returnCode, ...)
XCTAssertEqual(object.someStateProperty, ...)
这是处理单元测试时的风格问题,但在使用像 NSAssert
这样的宏时至关重要(因为这些宏是根据构建配置有条件地编译的,并且您不希望对象状态根据构建而改变)。
关于选项,强制解包或可选绑定都是允许的,不过,与往常一样,如果nil
值是可能的,则后者更安全。此外,如果nil
是可接受的值,您可能需要对各种排列(例如XCTAssertNil
和XCTAssertNotNil
)执行额外的测试。
这完全取决于您要测试的具体内容。
【讨论】:
以上是关于Swift:XCTest 会修改状态吗?可以返回可选值的测试函数的约定是啥?的主要内容,如果未能解决你的问题,请参考以下文章
我们可以为返回可选值的 swift 函数添加 @objc 吗?