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

How do I get the returning value of a function that can throw that I'm testing with XCTAssertNoThrow(...)

我想获取我正在测试的函数的 return 值以用于后续测试。函数定义如下:

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 ';'...

如何从 XCTAssertNoThrow 测试中获取 returned 值(在本例中为 Cherry 类型的对象)?还是我缺少更好的方法?

非常感谢

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

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

    XCTAssertEqual(result, .bing)
}

通过将测试方法本身标记为 throws,我们可以在不使用 ?! 的情况下调用 try。如果抛出,测试将失败。

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

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

示例:

let encryptedData = XCTAssertSuccessReturn(try encrypter.encrypt(data))

这是我比较喜欢的;它不会因为抛出意外错误而导致测试停止。它允许您添加一条消息:

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
}

这里的每个解决方案都有其优点和缺点。在尝试了所有方法之后,我喜欢将 Dave 和 Vitali 的错误报告与 Jon 的简单性相结合。

这提供了有关抛出的错误的信息,但没有致命错误,返回一个可选的或在抛出错误后执行后续的 XCTAssert 语句。

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

    XCTAssertEqual(result, .bing)
}