获取传递给完成处理程序以进行单元测试的值

Posted

技术标签:

【中文标题】获取传递给完成处理程序以进行单元测试的值【英文标题】:get value passed to completion handler for unit testing 【发布时间】:2018-04-16 18:45:22 【问题描述】:

我正在尝试将值传递给完成处理程序以进行单元测试。这不是完成处理程序的正常设置,因为完成处理程序是一个 var:

 typealias ResultType = Result<Data>
    typealias CompletionType = (ResultType) -> ()

 var onCompletion: CompletionType// this is the completion handler

open override func finished(_ errors: [NSError]) 
    self.urlSession.invalidateAndCancel()

self.onCompletion(Result.failure(EComError.networkError(.notReachable)))

    

我正在尝试将 var: onCompletion 与

进行比较
self.onCompletion(Result.failure(EComError.networkError(.notReachable)))

但是当我尝试打印 var: onCompletion 后,函数返回:

Optional((Function))

我正在尝试编写这样的测试用例:

   func test_finishedResult()

        sut?.finished([NSError(code: OperationErrorCode.executionFailed)])
           XCTAssertEqual(sut?.onCompletion(Result.failure(EComError.networkError(.notReachable))), sut?.onCompletion)
    

但它返回错误:

无法转换“DownloadOperation.CompletionType”类型的值? (又名 'Optional ()>') 到预期的参数类型'()?'

在哪里

下载操作

是函数所在类的名称。

对 var 进行单元测试的最佳方法是什么:

完成时

等于self.onCompletion(Result.failure(EComError.networkError(.notReachable)))?

【问题讨论】:

【参考方案1】:

在您的测试代码中,您不是比较传递给完成的值,而是比较回调的函数指针。

你可能想要的是这样的:

   func test_finishedResult() 
        // Set your callback here 
        sut?.onCompletion =  result in 
            // Compare the result here
            XCTAssertEqual(Result.failure(EComError.networkError(.notReachable)), result)
        
        // Trigger the callback with the finished method
        sut?.finished([NSError(code: OperationErrorCode.executionFailed)])
    

【讨论】:

这太棒了!像魅力一样工作。

以上是关于获取传递给完成处理程序以进行单元测试的值的主要内容,如果未能解决你的问题,请参考以下文章

单元测试

使用计算的返回值进行单元测试展开 segue

需要上下文的 Android 单元测试

服务器调用的完成和错误块的单元测试

使用内存磁盘进行 I/O 单元测试

如何访问另一个程序集中的类以进行单元测试?