Swift: XCTest 会修改状态吗?测试可以 return 可选值的函数的约定是什么?
Swift: Will XCTest modify state? And what is the convention of testing functions that could return optional values?
这里有两个问题:
XCTAssertEqual
函数和其他断言函数会修改程序的状态吗?我的意思是,例如
XCTAssertEqual(queue.dequeue(), ..., ...)
改变队列的状态? Swift(或者可能是一般的编程语言)是否将队列状态恢复到执行此语句之前的状态?
为可以 return 可选值的函数编写测试的推荐方法是什么?例如,我有一个方法 dequeue
,作为队列 class 的一部分,它可以 return 一个值,或者 nil
如果队列为空。
我应该怎么做(这里的想法是展开可选值):
XCTAssertEqual(queue.dequeue()!, ..., ...)
或者:
if let item = queue.dequeue() {
XCTAssertEqual(item, ..., ...)
}
或者可能是其他测试方式。
在此先感谢您的帮助。
是的,如果你调用一个改变object/variable状态的方法,那么用这个函数作为参数之一调用XCTAssert...
宏会导致调用状态更改方法,导致伴随的状态更改。不,这里没有任何东西可以恢复状态。
通常,如果涉及状态变化,我们中的许多人会将结果分配给一个变量,然后测试该变量(也可能测试状态变化):
let returnCode = object.changeState()
XCTAssertEqual(returnCode, ...)
XCTAssertEqual(object.someStateProperty, ...)
在处理单元测试时,这是一个风格问题,但在使用像 NSAssert
这样的宏时,这是至关重要的(因为这些是根据构建配置有条件地编译的,你不希望对象状态根据构建)。
关于可选值,强制展开或可选绑定都是允许的,但是,一如既往,如果 nil
值是可能的,则后者更安全。此外,如果 nil
是可接受的值,您可能需要对各种排列(例如 XCTAssertNil
和 XCTAssertNotNil
)执行额外的测试。
这完全取决于您要测试的内容。
这里有两个问题:
XCTAssertEqual
函数和其他断言函数会修改程序的状态吗?我的意思是,例如XCTAssertEqual(queue.dequeue(), ..., ...)
改变队列的状态? Swift(或者可能是一般的编程语言)是否将队列状态恢复到执行此语句之前的状态?
为可以 return 可选值的函数编写测试的推荐方法是什么?例如,我有一个方法
dequeue
,作为队列 class 的一部分,它可以 return 一个值,或者nil
如果队列为空。我应该怎么做(这里的想法是展开可选值):
XCTAssertEqual(queue.dequeue()!, ..., ...)
或者:
if let item = queue.dequeue() { XCTAssertEqual(item, ..., ...) }
或者可能是其他测试方式。
在此先感谢您的帮助。
是的,如果你调用一个改变object/variable状态的方法,那么用这个函数作为参数之一调用
XCTAssert...
宏会导致调用状态更改方法,导致伴随的状态更改。不,这里没有任何东西可以恢复状态。通常,如果涉及状态变化,我们中的许多人会将结果分配给一个变量,然后测试该变量(也可能测试状态变化):
let returnCode = object.changeState() XCTAssertEqual(returnCode, ...) XCTAssertEqual(object.someStateProperty, ...)
在处理单元测试时,这是一个风格问题,但在使用像
NSAssert
这样的宏时,这是至关重要的(因为这些是根据构建配置有条件地编译的,你不希望对象状态根据构建)。关于可选值,强制展开或可选绑定都是允许的,但是,一如既往,如果
nil
值是可能的,则后者更安全。此外,如果nil
是可接受的值,您可能需要对各种排列(例如XCTAssertNil
和XCTAssertNotNil
)执行额外的测试。这完全取决于您要测试的内容。