小编典典

Swift中的单元测试fatalError

swift

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

例如,我有以下快速代码

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

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

    return x / y
}

我想对y = 0的情况进行单元测试。

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


阅读 364

收藏
2020-07-07

共1个答案

小编典典

Nimble(“用于Swift和Objective-
C的Matcher框架”)得到了支持:

迅捷断言

如果使用的是Swift,则可以使用throwAssertion匹配器检查是否抛出了断言(例如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方案的“测试”配置的“调试”可执行方案设置。
2020-07-07