gpt4 book ai didi

unit-testing - 如何测试在 Swift 2 中引发错误的方法?

转载 作者:行者123 更新时间:2023-12-04 01:34:49 26 4
gpt4 key购买 nike

这是我的方法定义:

func isValidForMode(mode: DBFindViewControllerMode) throws -> Bool { }

现在我可以用简单的方式测试它,因为我知道它 不要抛出错误:
XCTAssertTrue(try! searchOptionsManager.isValidForMode(.Address))

但是如果我知道那个方法会抛出呢?

最好的解决方案是 XCTAssertThrows() ,但它不是:-)

下面是我的尝试:
do {
try searchOptionsManager.isValidForMode(.Address)
} catch let error {
XCTAssertEqual(error as! DBErrorType, DBErrorType.CannotBeEmpty("Street"))
}

但它失败了,因为:

Cannot find an overload for XCTAssertEqual that accepts an argument list of type (DBErrorType, DBErrorType)

最佳答案

让您的 DBError符合 Equatable :

enum DBError: ErrorType, Equatable {
case CannotBeEmpty(message: String)
}

func ==(lhs: DBError, rhs: DBError) -> Bool {
switch (lhs, rhs) {
case (.CannotBeEmpty(let leftMessage), .CannotBeEmpty(let rightMessage)):
return leftMessage == rightMessage
}
}

然后你可以在 XCTAssertEqual中使用它:
func testExample() {
do {
try isValid()
}
catch let e as DBError {
XCTAssertEqual(e, DBError.CannotBeEmpty(message: "Street"))
}
catch {
XCTFail("Wrong error")
}
}

或创建您自己的 XCTAssertThrows .
enum DBError: ErrorType, Equatable {
case CannotBeEmpty(message: String)
}

func ==(lhs: DBError, rhs: DBError) -> Bool {
switch (lhs, rhs) {
case (.CannotBeEmpty(let leftMessage), .CannotBeEmpty(let rightMessage)):
return leftMessage == rightMessage
}
}

和:
func XCTAssertThrows<T: ErrorType where T: Equatable>(error: T, block: () throws -> ()) {
do {
try block()
}
catch let e as T {
XCTAssertEqual(e, error)
}
catch {
XCTFail("Wrong error")
}
}

class TestsTests: XCTestCase {

func testExample() {
XCTAssertThrows(DBError.CannotBeEmpty(message: "Street")) { try isValid() }
}

}

关于unit-testing - 如何测试在 Swift 2 中引发错误的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31558635/

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