测试在抛出的 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 上返回“表达式类型不明确,没有更多上下文”的主要内容,如果未能解决你的问题,请参考以下文章