这里有两个问题:
-
XCTAssertEqual
函数和其他断言函数是否会修改程序的状态?我的意思是,例如,会像XCTAssertEqual(queue.dequeue(), ..., ...)
更改队列的状态?Swift(或者可能是一般的编程语言)是否会将队列的状态恢复到执行此语句之前的状态?
-
为可能返回可选值的函数编写测试的推荐方法是什么?例如,我有一个方法
dequeue
,作为 Queue 类的一部分,它可以返回一个值,或者如果队列为空,则返回nil
。我应该这样做(这里的想法是解开可选值):
XCTAssertEqual(queue.dequeue()!, ..., ...)
或:
if let item = queue.dequeue() { XCTAssertEqual(item, ..., ...) }
或者可能是其他测试方法。
提前感谢任何帮助。
-
是的,如果您调用更改对象/变量状态的方法,则使用此函数作为参数宏之一调用
XCTAssert...
将导致调用状态更改方法,从而导致伴随的状态更改。不,这里没有任何内容可以恢复状态。传统上,如果涉及状态更改,我们中的许多人会将结果分配给一个变量,然后测试该变量(可能还有状态更改):
let returnCode = object.changeState() XCTAssertEqual(returnCode, ...) XCTAssertEqual(object.someStateProperty, ...)
在处理单元测试时,这是一个风格问题,但在使用像
NSAssert
这样的宏时至关重要(因为这些宏是根据构建配置有条件地编译的,并且您不希望对象状态根据构建而更改)。
关于可选,强制 解包或可选绑定是允许的,但与往常一样,如果值可能
nil
后者更安全。此外,如果nil
是可接受的值,您可能需要对各种排列执行其他测试(例如XCTAssertNil
和XCTAssertNotNil
)。这完全取决于您要测试的内容。