Swift:XCTest 会修改状态吗?测试可以返回可选值的函数的约定是什么



这里有两个问题:

  1. XCTAssertEqual函数和其他断言函数是否会修改程序的状态?我的意思是,例如,会像

    XCTAssertEqual(queue.dequeue(), ..., ...)
    

    更改队列的状态?Swift(或者可能是一般的编程语言)是否会将队列的状态恢复到执行此语句之前的状态?

  2. 为可能返回可选值的函数编写测试的推荐方法是什么?例如,我有一个方法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这样的宏时至关重要(因为这些宏是根据构建配置有条件地编译的,并且您不希望对象状态根据构建而更改)。

  2. 关于可选,强制
  3. 解包或可选绑定是允许的,但与往常一样,如果值可能nil后者更安全。此外,如果nil是可接受的值,您可能需要对各种排列执行其他测试(例如 XCTAssertNilXCTAssertNotNil)。

    这完全取决于您要测试的内容。

最新更新