首页 > 解决方案 > 测试在抛出的 func 上返回“表达式类型不明确,没有更多上下文”

问题描述

我正在编写一个网络层,遵循 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"
}

标签: swiftunit-testingxctestcase

解决方案


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

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

你得到了真正的错误

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

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


然而,这引发了一个新的错误

无法将不可变值作为 inout 参数传递:“请求”是“让”常量

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


推荐阅读