验证 Swift 中抛出运行时错误的单元测试

Ell*_*ock 8 error-handling try-catch swift swift5

谷歌搜索让我找到了一般的 Swift 错误处理链接,但我有一个更具体的问题。我认为这里的答案是“不,你运气不好”,但我想仔细检查一下我是否遗漏了一些东西。几年前的这个问题看起来很相似,并且有一些看起来很粗糙的解决方法的答案......我想看看最新版本的 Swift 是否使更优雅的东西成为可能。

情况:我有一个未用 标记的函数throws,并且使用try!

目标:我想创建一个单元测试来验证,是的,给这个函数错误的东西实际上会失败并抛出(运行时/致命)错误。

问题:

  1. 当我将此函数包装在 do-catch 中时,编译器警告我 catch 块无法访问。
  2. 当我运行测试并传递错误的参数时, do-catch 不会捕获错误。
  3. XCTAssertThrows也没有捕获错误。

该函数的构建目的是与另一个无声失败的函数具有相同的签名,我在模拟器上将其替换为该函数,以便在测试(自动或手动)期间可以大声失败。所以我不能只是将其更改为抛出函数,因为那样的话另一个函数必须被标记为抛出,并且我希望它默默地失败。

那么,有没有办法抛出一个可以在单元测试中捕获的未处理错误?

或者,我可以在不更改签名的情况下以可测试的方式让这个函数爆炸吗?

Asp*_*eri 1

Swift(直到并包括当前的 5.5)明确假设非抛出函数内的所有错误必须在内部处理(!)。因此 swift 的设计没有公共机制来干预这个过程并产生运行时错误。

演示