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

Swift: Will XCTest modify state? And what is the convention of testing functions that could return optional values?

这里有两个问题:

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

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

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

  2. 为可以 return 可选值的函数编写测试的推荐方法是什么?例如,我有一个方法 dequeue,作为队列 class 的一部分,它可以 return 一个值,或者 nil 如果队列为空。

    我应该怎么做(这里的想法是展开可选值):

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

    或者:

    if let item = queue.dequeue() {
        XCTAssertEqual(item, ..., ...)
    } 
    

    或者可能是其他测试方式。

在此先感谢您的帮助。

  1. 是的,如果你调用一个改变object/variable状态的方法,那么用这个函数作为参数之一调用XCTAssert...宏会导致调用状态更改方法,导致伴随的状态更改。不,这里没有任何东西可以恢复状态。

    通常,如果涉及状态变化,我们中的许多人会将结果分配给一个变量,然后测试该变量(也可能测试状态变化):

    let returnCode = object.changeState()
    XCTAssertEqual(returnCode, ...)
    XCTAssertEqual(object.someStateProperty, ...)
    

    在处理单元测试时,这是一个风格问题,但在使用像 NSAssert 这样的宏时,这是至关重要的(因为这些是根据构建配置有条件地编译的,你不希望对象状态根据构建)。

  2. 关于可选值,强制展开或可选绑定都是允许的,但是,一如既往,如果 nil 值是可能的,则后者更安全。此外,如果 nil 是可接受的值,您可能需要对各种排列(例如 XCTAssertNilXCTAssertNotNil)执行额外的测试。

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