在使用XCTest的Swift 2中,是否可以测试强制解包的结果?我希望像Jasmine的charSequences
:
private Object[] remove(Object val, Object[] array)
{
ArrayList<Object> newArray = new ArrayList<Object>();
for (Object o : array)
if(!o.equals(val))
newArray.add(o);
return newArray.toArray(new Object[newArray.size()]);
}
答案 0 :(得分:3)
根据swift的定义,您无法捕获强制解包失败。此外,我不认为在生产代码中使用强制解包是一个好主意,除非你绝对肯定不会失败。
如果您使用以下内容,则可以获得展开异常:
guard let a = a else { throw ... }
而不是a!
答案 1 :(得分:2)
使用新的XCTUnwrap
来解开对象并断言值是否为零。
let optional: String? = "optional"
let unwrapped: String = try XCTUnwrap(optional) // throws
在非抛出功能中,您可以像这样使用guard
来测试失败的单线:
guard let unwrapped = 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
答案 2 :(得分:1)
我没有明确的答案,但强制解包的值Apple's documentation说明如下:
请注意
试着用!访问不存在的可选值会触发运行时错误。在使用之前,请务必确保可选项包含非零值!强行解开它的价值。
swift语言(2.0)目前没有语法来捕获这些runtime error
。这些可能等同于不会被Objective-C的@try/@catch
语法困住的分段错误/杀戮。
似乎您正在测试语言的功能本身(即强制解包nil
值会引发异常)而不是应用程序的逻辑。你最好按照@Mario Zannone的建议捕捉throw
。
let a: Something? = MAYBE_NIL_MAYBE_NOT
func unwrap(test: Any?)
{
guard let value = test else {
throw // an ErrorType
}
}
XCTAssertCausesError(unwrap(a))