[英]How to unit test a forced unwrapping
在带有XCTest的Swift 2中,是否可以测试强制展开的结果? 我希望像茉莉花的expect(...).toThrow()
:
let a: Something? = MAYBE_NIL_MAYBE_NOT
func unwrap()
{
a!
}
XCTAssertCausesError(unwrap)
根据定义,您不能迅速捕获到强制打开失败。 而且,除非您绝对确定不会失败,否则我认为在生产代码中使用强制拆包不是一个好主意。
如果使用以下方法,则会得到解包异常:
guard let a = a else { throw ... }
而不是a!
注意
尝试使用! 访问不存在的可选值会触发运行时错误。 在使用!之前,请始终确保可选值包含非nil值。 强制释放其价值。
迅捷的语言(2.0)当前没有语法来捕获这些runtime error
。 这些可能等效于细分错误/技巧,而不会被Objective-C的@try/@catch
语法所困。
看来您正在测试语言的功能本身(即,强制展开nil
值将引发异常),而不是应用程序的逻辑。 你抓过一个更好的throw
被@Mario赞诺内岛的建议。
let a: Something? = MAYBE_NIL_MAYBE_NOT
func unwrap(test: Any?)
{
guard let value = test else {
throw // an ErrorType
}
}
XCTAssertCausesError(unwrap(a))
使用新的XCTUnwrap
解开对象并断言值是否为nil。
let optional: String? = "optional"
let unwrapped: String = try XCTUnwrap(optional) // throws
在非抛出函数中,可以将guard
用于测试失败的单行代码,如下所示:
let unwrapped = guard try? XCTUnwrap(optional) else { return }
这本质上与测试力解开相同。 只是使用功能而不是!
。
XCTUnwrap
断言Optional变量的值不为nil,如果断言成功,则返回其值。这消除了将
XCTAssertNotNil(_:_:file:line:)
与解包值或在其余测试中处理条件链接结合在一起的需要。 例如:
func testFirstNameNotEmpty() throws {
let forenames: [String] = customer.forenames
let firstName = try XCTUnwrap(forenames.first)
XCTAssertFalse(firstName.isEmpty)
}
在WWDC 2019和Xcode 11发行说明中宣布:
https://developer.apple.com/documentation/xcode_release_notes/xcode_11_release_notes
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.