如何对强制展开进行单元测试

时间:2015-07-21 10:25:00

标签: swift xctest swift2

在使用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()]);
}

3 个答案:

答案 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))