我正在按照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"
}
答案 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 = ...