使用泛型参数对函数进行快速单元测试

Posted

技术标签:

【中文标题】使用泛型参数对函数进行快速单元测试【英文标题】:Swift unit testing of function with generic parameter 【发布时间】:2017-06-22 12:03:08 【问题描述】:

我有一个函数定义如下:

func parse<T: Mappable>(_ data: Data, _ completion: (Result<[T]>) -> Void) 
    completion(Result 
        do 
            let decodedData: Any = try decode(data)
            let checkedArray: [AnyObject] = try check(decodedData)
            let models: [T] = mapToModels(checkedArray)
            return models
         catch 
            throw error
        
    )

当我尝试运行以下单元测试时:

func testInvalidData() 
    let test = "test"
    let invalidData = test.data(using: .utf8)

    parse(invalidData,  result in
  //^Generic parameter 'T' could not be inferred
        switch result 
        case .success(let users):
            XCTFail()
        case .failure(let error):
            XCTAssertNotNil(error)
        
    )

如上所述,我收到错误 Generic parameter 'T' could not be inferred

这个函数编译、构建和工作正常(当不是单元测试时)。

知道如何测试吗?

【问题讨论】:

func parse&lt;T: Mappable&gt;(_ data: Data, _ completion: (Result&lt;[T]&gt;) -&gt; Void) 这行不是导致任何错误吗? 【参考方案1】:

错误说明无法推断完成处理程序中result 参数的类型。这意味着您必须显式声明其类型:

func testInvalidData() 
    let test = "test"
    let invalidData = test.data(using: .utf8)

    parse(invalidData,  (result: Result<[DesiredTypeHere]>) in
    // ^Replace 'DesiredTypeHere' with expected type
        switch result 
        case .success(let users):
            XCTFail()
        case .failure(let error):
            XCTAssertNotNil(error)
        
    )

【讨论】:

感谢您的及时回复,原来如此。我被直接指向 parse 函数而不是块内的 result 的错误误导了。 是的,有时 Xcode 的视觉错误标志可能会产生误导。很高兴我能帮上忙!

以上是关于使用泛型参数对函数进行快速单元测试的主要内容,如果未能解决你的问题,请参考以下文章

对使用 gorilla/mux URL 参数的函数进行单元测试

什么是单元测试?如何做好单元测试?

使用请求对 NestJS 控制器进行单元测试

如何对依赖于 ActivatedRoute 参数的组件进行单元测试?

如何编写与数据库无关的函数,使其更易于进行单元测试

如何使用私有构造函数对类进行单元测试?