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 是可接受的值,您可能需要对各种排列(例如XCTAssertNilXCTAssertNotNil)执行额外的测试。

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

【讨论】:

以上是关于Swift:XCTest 会修改状态吗?可以返回可选值的测试函数的约定是啥?的主要内容,如果未能解决你的问题,请参考以下文章

swift上的Alamofire返回状态代码问题

Swift XCTest 命名空间错误?

我们可以为返回可选值的 swift 函数添加 @objc 吗?

XCTestCase 与 Pure Swift 类

如何通过与 swift/xctest 协调来点击 iOS 主屏幕上的某个点

我可以在不失败的情况下做出 XCTest 期望吗?