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

时间:2018-04-16 18:45:23

标签: ios swift unit-testing xctest completionhandler

我正在尝试将值传递给完成处理程序以测试单元测试。它不是完成处理程序的正常设置,因为完成处理程序是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?”类型的值(又名   '可选&lt;(结果) - &gt; ()&gt;')预期参数类型'()?'

其中

  

DownloadOperation

是函数所在类的名称。

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

  

onCompletion

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

1 个答案:

答案 0 :(得分:0)

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

你可能想要的是:

   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)])
    }