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

时间:2018-10-01 11:05:10

标签: unit-testing assert xctest

我想获取我正在测试的函数的返回值,以进行后续测试。该函数的定义如下:

.graphsdata { width: 100%; height: 800px; overflow: hidden; } .graph-div { min-width: 800px; min-height: 600px; overflow: hidden; } .graphs-div { width: 2200px; min-height: 600px; overflow: hidden; }

我可以测试它何时应该抛出:

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 ';'...测试中获取返回值(在这种情况下为Cherry类型的对象)?还是我缺少一种更好的方法?

非常感谢

3 个答案:

答案 0 :(得分:3)

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

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

    XCTAssertEqual(result, .bing)
}

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

答案 1 :(得分:0)

我正在使用此静态函数:

random.random()

示例:

__next__

答案 2 :(得分:0)

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

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
}