繁体   English   中英

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

[英]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!

我没有明确的答案,但是Apple关于强制解开值的文档说:

注意
尝试使用! 访问不存在的可选值会触发运行时错误。 在使用!之前,请始终确保可选值包含非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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM