测试在抛出的 func 上返回“表达式类型不明确,没有更多上下文”

Posted

技术标签:

【中文标题】测试在抛出的 func 上返回“表达式类型不明确,没有更多上下文”【英文标题】:Test returns "Type of expression is ambiguous without more context" on func that throws 【发布时间】:2018-12-26 13:03:54 【问题描述】:

我正在编写一个网络层,遵循 TDD 方法。

我有一个结构,我将使用它来编码我的请求中的任何参数。

我想断言,在调用此编码器时,如果 URL 丢失/为零,则会引发正确的错误。

struct URLParameterEncoder: ParameterEncoder 
    static func encode(urlRequest: inout URLRequest, with parameters: Parameters) throws 
        guard let url = urlRequest.url else  throw NetworkError.missingURL 
    

我编写了一个测试并传递了一个我认为应该满足此测试的 URL,但是在尝试运行测试时出现错误。

class URLParameterEncoderTests: XCTestCase 
    var sut: URLParameterEncoder!

    override func setUp() 
        sut = URLParameterEncoder()
    

    func test_Encode_ThrowsMissingURLError_WhenURLIsNil() 
        let request = URLRequest(url: URL(string: "")!)
        let params: Parameters = [:]

        XCTAssertThrowsError(try sut.encode(urlRequest: &request, with: params))  error in
            XCTAssertEqual(error as? NetworkError, NetworkError.missingURL)
        
    

在我的XCTAssertThrowsError 中,我收到了Type of expression is ambiguous without more context,我相信它是在sut.encode 周围触发的

复制需要额外的代码

public typealias Parameters = [String: Any]

public protocol ParameterEncoder 
    static func encode(urlRequest: inout URLRequest, with parameters: Parameters) throws


public enum NetworkError: String, Error 
    case paramsAreNil = "Missing params"
    case encodingFailed = "Could not encode params"
    case missingURL = "Request URL is missing"

【问题讨论】:

【参考方案1】:

在添加更多上下文之后——可选链接的问号,因为sut仍然是可选的——

XCTAssertThrowsError(try sut?.encode(urlRequest: &request, with: params))  error in ...

你得到了真正的错误

静态成员“encode”不能用于“URLParameterEncoder”类型的实例

这意味着encode必须在类型URLParameterEncoder.encode(...上调用


但是这会引发一个新的错误

不能将不可变值作为 inout 参数传递:'request' 是一个 'let' 常量

这意味着像request 这样的inout 参数必须声明为变量:var request = ...

【讨论】:

以上是关于测试在抛出的 func 上返回“表达式类型不明确,没有更多上下文”的主要内容,如果未能解决你的问题,请参考以下文章

了解Java在抛出异常时的堆栈展开

为啥方法在抛出异常后不需要返回值?

代码返回“表达式类型不明确,没有更多上下文”Swift

放入函数时,工作 Swift 代码返回“表达式类型不明确,没有更多上下文”

为啥内核驱动程序在抛出异常时无法更新注册表值?

在抛出“NSException”(gdb)的实例后调用终止