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

时间:2018-12-26 13:03:54

标签: swift unit-testing xctestcase

我正在按照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 个答案:

答案 0 :(得分:0)

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

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

您得到真正的错误

  

静态成员'encode'不能用于类型为'URLParameterEncoder'的实例

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


但是这会引发新的错误

  

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

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