gpt4 book ai didi

swift - XCTAssertThrowsError 自定义错误处理程序的奇怪行为

转载 作者:搜寻专家 更新时间:2023-10-31 22:06:46 24 4
gpt4 key购买 nike

在我的单元测试中,我有以下代码检查抛出的错误是否属于预期类型。它是用两个相同的语句完成的,其中一个不能编译:

    enum Error: ErrorType {
case SomeExpectedError
case SomeUnexpectedError
}

func functionThatThrows() throws {
throw Error.SomeExpectedError
}

// 1) this compiles fine
XCTAssertThrowsError(try functionThatThrows()) { (error) in
switch error {
case Error.SomeExpectedError: break
//everything is fine
case Error.SomeUnexpectedError: fallthrough
default:
XCTFail("Unexpected error thrown")
}
}

// 2) doesn't compiles at all
XCTAssertThrowsError(try functionThatThrows()) { (error) in
XCTAssertEqual(error as? Error, Error.SomeExpectedError)
}

第一个语句编译并运行良好,但第二个语句告诉我有两个错误:未处理从此处抛出的错误并且无法将“(Error) -> Void”类型的值转换为预期的参数类型“String”

这段代码可能有什么问题?错误消息是什么意思?

我正在使用 Xcode 7.3。

最佳答案

经过一些研究,我发现我的代码有 2 个问题:

1) 似乎我的关闭考虑了 "Impilictly returning"因为它只包含一个可执行语句

2) 编译器对我的声明感到困惑,因为 XCTAssertThows 再接受一个接受闭包的参数 - 它是 @autoclosure _ message: () -> String

结果编译器认为我为消息传递了闭包(恕我直言,令人困惑的设计决定 - 将 @autoclosure 作为消息参数传递),而实际上我为 errorHandler 传递了闭包。

解决方法很简单:

    // explicitly show closure returning type Void so that compiler couldn't
// use it as message argument (which closure must return String)
XCTAssertThrowsError(try functionThatThrows()) { (error) -> Void in
XCTAssertEqual(error as? Error, Error.SomeExpectedError)
}

// explicitly show closure's argument type
XCTAssertThrowsError(try functionThatThrows()) { (error: ErrorType) in
XCTAssertEqual(error as? Error, Error.SomeExpectedError)
}

// use "message" parameter to preserve argument order
XCTAssertThrowsError(try functionThatThrows(), "some message") { (error) in
XCTAssertEqual(error as? Error, Error.SomeExpectedError)
}

// wrap executable line in "do {}". I guess it works because closure stops
// being "implicitly returning" and now compiler treat it as () -> Void
// which is expected type of errorHandler argument
XCTAssertThrowsError(try functionThatThrows()) { (error) in
do {
XCTAssertEqual(error as? Error, Error.SomeExpectedError)
}
}

关于swift - XCTAssertThrowsError 自定义错误处理程序的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36190161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com