如何在Swift中实现fatalError代码路径的单元测试?

例如,我有以下swift代码

func divide(x: Float, by y: Float) -> Float {

    guard y != 0 else {
        fatalError("Zero division")
    }

    return x / y
}

我想在y=0的情况下进行单元测试.

注意,我想使用fatalError,而不是任何其他断言函数.

推荐答案

Nimble("Swift and Objective-C的Matcher框架")支持您:

迅速的断言

如果您使用的是Swift,那么可以使用ThrowaSertion matcher来判断是否抛出了断言(例如fatalError().这是由@mattgallagher的CwlPreconditionTesting库实现的.

// Swift

// Passes if 'somethingThatThrows()' throws an assertion, 
// such as by calling 'fatalError()' or if a precondition fails:
expect { try somethingThatThrows() }.to(throwAssertion())
expect { () -> Void in fatalError() }.to(throwAssertion())
expect { precondition(false) }.to(throwAssertion())

// Passes if throwing an NSError is not equal to throwing an assertion:
expect { throw NSError(domain: "test", code: 0, userInfo: nil) }.toNot(throwAssertion())

// Passes if the code after the precondition check is not run:
var reachedPoint1 = false
var reachedPoint2 = false
expect {
    reachedPoint1 = true
    precondition(false, "condition message")
    reachedPoint2 = true
}.to(throwAssertion())

expect(reachedPoint1) == true
expect(reachedPoint2) == false

笔记:

  • 此功能仅在Swift中可用.
  • 它只支持x86_64二进制文件,这意味着您不能在iOS设备上运行此匹配器,只能在模拟器上运行.
  • tvOS模拟器是受支持的,但使用了不同的机制,需要关闭tvOS方案测试配置的调试可执行方案设置.

Swift相关问答推荐

Swift concurrency reload/await,支持只执行成功并重试

按下一步后无法让文本字段切换焦点

SwiftUI 交易:根据外部状态制作一个动画或静止的按钮

PassthroughSubject 的 AsyncPublisher 值属性未生成所有值

如何延迟 swift 属性 didSet 使其每秒只触发一次

如何在 SceneKit 上制作毛玻璃效果

在 Swift 中增量写入大型文本文件的最佳方法

格式化大货币数字

Swift 非参与者隔离闭包

SwiftUI 视图的默认成员初始化器 VS 自定义初始化器

如何获得不同的插入和移除过渡动画?

符合协议要求委托变量在 ios13 中可用

在 Swift 4 中,如何删除基于块的 KVO 观察者?

如何在Swift中找出字母是字母数字还是数字

如何在 SwiftUI 中以编程方式滚动列表?

swift中静态函数和单例类的区别

快速延迟加载属性

在 Swift 中从服务器播放视频文件

如何判断 firebase 数据库值是否存在?

将 UIImage 剪成圆形