swift - 测试在抛出的 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"
}
解决方案
添加更多上下文之后——可选链接的问号,因为sut
仍然是可选的——
XCTAssertThrowsError(try sut?.encode(urlRequest: &request, with: params)) { error in ...
你得到了真正的错误
静态成员“编码”不能用于“URLParameterEncoder”类型的实例
这意味着encode
必须在类型上调用URLParameterEncoder.encode(...
然而,这引发了一个新的错误
无法将不可变值作为 inout 参数传递:“请求”是“让”常量
这意味着必须将inout
参数request
声明为变量:var request = ...
推荐阅读
- blockchain - 电工重新索引 btc 区块链时打开文件过多错误
- javascript - 有没有办法在 NestJS 中使用静态方法和依赖注入?
- python - 如何连接到串口并在 streamlit 应用程序中读取数据流?
- typescript - 如何从 Types.ts 文件中导出 TypeScript 中的对象
- google-apps-script - 将过滤后的数据复制到另一个工作表,但如果满足条件则创建一个空白行
- testing - 空手道自动化测试框架 - 需要访问从 karate-config.js 运行的功能列表
- pandas - 插补后数据框列中均值的空值
- laravel - 清除旧的输入值?
- javascript - 汉堡菜单不显示 CSS、JS 和 HTML
- azure - 无法从逻辑应用连接到 SQL Server