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 ';'...
如何Cherry从XCTAssertNoThrow测试中获取返回值(在本例中为类型对象)?或者有没有更好的方法我错过了?
非常感谢
只需调用该函数,并针对返回值进行断言:
func test_apple_withGoodBanana_shouldReturnBingCherry() throws {
let result = try apple(banana: goodBanana)
XCTAssertEqual(result, .bing)
}
Run Code Online (Sandbox Code Playgroud)
通过标记测试方法本身,throws我们可以调用trywithout?或!。如果抛出,则测试将失败。
我正在使用这个静态函数:
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)
这是我更喜欢的一个;它不会仅仅因为抛出意外错误而导致测试停止。它可以让你添加一条消息:
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)
| 归档时间: |
|
| 查看次数: |
1050 次 |
| 最近记录: |