如何在Swift 2.0中测试功能?如何断言抛出了正确的ErrorType

推荐答案

编辑:将代码更新为Swift 4.1(对Swift 5.2仍然有效)

以下是使用XCTAssertThrowsErrorFyodor Volchyok's answer的最新Swift版本:

    enum MyError: Error {
        case someExpectedError
        case someUnexpectedError
    }

    func functionThatThrows() throws {
        throw MyError.someExpectedError
    }

    func testFunctionThatThrows() {
        XCTAssertThrowsError(try functionThatThrows()) { error in
            XCTAssertEqual(error as! MyError, MyError.someExpectedError)
        }
    }

如果Error enum具有关联值,则可以让Error enum符合Equatable,或使用if case语句:

    enum MyError: Error, Equatable {
        case someExpectedError
        case someUnexpectedError
        case associatedValueError(value: Int)
    }

    func functionThatThrows() throws {
        throw MyError.associatedValueError(value: 10)
    }

    // Equatable pattern: simplest solution if you have a simple associated value that can be tested inside 1 XCTAssertEqual
    func testFunctionThatThrows() {
        XCTAssertThrowsError(try functionThatThrows()) { error in
            XCTAssertEqual(error as! MyError, MyError.associatedValueError(value: 10))
        }
    }

    // if case pattern: useful if you have one or more associated values more or less complex (struct, classes...)
    func testFunctionThatThrows() {
        XCTAssertThrowsError(try functionThatThrows()) { error in
            guard case MyError.associatedValueError(let value) = error else {
                return XCTFail()
            }

            XCTAssertEqual(value, 10)
            // if you have several values or if they require more complex tests, you can do it here
        }
    }

Swift相关问答推荐

如何使用 Date.ParseStrategy 在 Swift 5.6 中将字符串解析为日期?

组合 flatMap 不会返回预期的上下文结果类型

What is "SwiftPM.SPMRepositoryError error 5"?

Xcode 13.3 将函数调用更改为属性访问

如何防止 UITableViewCell 移动(Swift 5)

SwiftUI:如何绘制填充和描边的形状?

Firebase Analytics setScreenName 已弃用

由于权利不足,代码签名无效

如何在 Swift 包管理器库中包含assets资源 /资源?

SwiftUI - 呈现工作表后导航栏按钮不可点击

Xcode 在上传时卡在“将包上传到 App Store”阶段

Xcode 11.4.导航的标题 colored颜色 从情节提要中变为黑色

SwiftUI TextField 最大长度

如何在 SwiftUI 中删除列表的左右填充?

检测 iOS 暗模式更改

在 SwiftUI 中有条件地使用视图

UIWindow 未在 iOS 13 中显示内容

如何避免 SwiftUI 中的嵌套导航栏?

由于编译器中的“内部”保护级别,无法访问框架 init 中的公共结构

iOS:检测设备是否为 iPhone X 系列(无框)