如何获取我正在使用 XCTAssertNoThrow(...) 测试的可以抛出的函数的返回值

Jos*_*oid 5 unit-testing assert xctest

我想获取我正在为后续测试测试的函数的返回值。函数定义如下:

func apple(banana: Banana) throws -> Cherry { ... }

我可以测试它应该在什么时候抛出:

XCTAssertThrowsError(try apple(banana: badBanana), "Didn't throw")

我可以测试它在不应该抛出时不会抛出:

XCTAssertNoThrow(try apple(banana: goodBanana), "Did throw")

我希望这样做:

XCTAssertNoThrow(let cherry = try apple(banana: goodBanana), "Did throw")

然后检查cherry是我所期望的,但我收到以下错误:Consecutive statements on a line must be separated by ';'...

如何CherryXCTAssertNoThrow测试中获取返回值(在本例中为类型对象)?或者有没有更好的方法我错过了?

非常感谢

Jon*_*eid 8

只需调用该函数,并针对返回值进行断言:

func test_apple_withGoodBanana_shouldReturnBingCherry() throws {
    let result = try apple(banana: goodBanana)

    XCTAssertEqual(result, .bing)
}
Run Code Online (Sandbox Code Playgroud)

通过标记测试方法本身,throws我们可以调用trywithout?!。如果抛出,则测试将失败。


Vit*_*nko 5

我正在使用这个静态函数:

func XCTAssertSuccessReturn<T>(
  _ expression: @autoclosure () throws -> T,
  in file: StaticString = #file,
  line: UInt = #line
  ) -> T {
  do {
    return try expression()
  } catch {
    XCTFail(
      error.localizedDescription,
      file: file,
      line: line
    )
    fatalError(error.localizedDescription)
  }
}
Run Code Online (Sandbox Code Playgroud)

例子:

let encryptedData = XCTAssertSuccessReturn(try encrypter.encrypt(data))
Run Code Online (Sandbox Code Playgroud)


Dav*_*ams 5

这是我更喜欢的一个;它不会仅仅因为抛出意外错误而导致测试停止。它可以让你添加一条消息:

func CheckNoThrow<T>(
  _ expression: @autoclosure () throws -> T,
  _ message: @autoclosure () -> String = "",
  file: StaticString = (#filePath),
  line: UInt = #line
) -> T? {
  var r: T?
  XCTAssertNoThrow(
    try { r = try expression() }(), message(), file: file, line: line)
  return r
}
Run Code Online (Sandbox Code Playgroud)