我如何获得我正在使用 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)
}
我想获取我正在测试的函数的 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)
}