如何测试在Swift 2中引发错误的方法? [英] How to test method that throws error in Swift 2?

查看:164
本文介绍了如何测试在Swift 2中引发错误的方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的方法定义:

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

现在我可以用简单的方式测试,因为我知道它 DO NOT 抛出错误:

Now I can test this in simple way, since I know that it DO NOT throws an error:

XCTAssertTrue(try! searchOptionsManager.isValidForMode(.Address))

但是如果我知道该方法抛出了什么?

But what if I know that method throws?

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

The best solution would be XCTAssertThrows(), but it is not:-)

以下是我的尝试:

do {
    try searchOptionsManager.isValidForMode(.Address)
} catch let error {
    XCTAssertEqual(error as! DBErrorType, DBErrorType.CannotBeEmpty("Street"))
}

但是失败,因为:


找不到 XCTAssertEqual 接受参数列表的重载的类型(DBErrorType,DBErrorType)

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


推荐答案

使您的 DBError 符合 Equatab le

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

And then you can use it in XCTAssertEqual:

func testExample() {
  do {
    try isValid()
  }
  catch let e as DBError {
    XCTAssertEqual(e, DBError.CannotBeEmpty(message: "Street"))
  }
  catch {
    XCTFail("Wrong error")
  }
}







Or create your own 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
  }
}

And:

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() }
    }

}

这篇关于如何测试在Swift 2中引发错误的方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆