【问题标题】:Testing Swift code with preconditions使用前置条件测试 Swift 代码
【发布时间】:2016-08-10 03:18:05
【问题描述】:

如何为具有前置条件的 Swift 方法编写测试?这是一个例子:

func doublePositive(n:Int) -> Int {
    precondition(n >= 0)
    return 2*n
}

使用XCTAssertThrowsError 不起作用:

func testDoublePositive() {
    XCTAssertEqual(10, testObject.doublePositive(5))    // Works
    XCTAssertThrowsError(testObject.doublePositive(-1)) // Breaks 
}

这会在运行测试时产生错误:

线程 1:EXEC_BAD_INSTRUCTION(代码=EXCI386_INVOP,子代码=0x0)

有没有办法测试 Swift 的前置条件?

【问题讨论】:

  • 没有标准的方法来“捕捉”前置条件的失败,它总是会停止程序,不过有一些调整,看看cocoawithlove.com/blog/2016/02/02/…
  • @ogres 哇,这篇文章不错,谢谢!
  • 我迫不及待地想在非测试代码中看到这一点。我很高兴这可以让您测试您要测试的内容,但我讨厌那个网站......因为我保证有人在他们的主要目标中实现了这个并且孤立崩溃的线程只是为了防止应用程序崩溃...... (我这么说是因为我在他们类似的 Objective-C 文章中看到过这种情况……)
  • @nhgrif 我希望 Apple 能够让开发人员更轻松地测试先决条件,因为他们处于最佳位置。在前置条件/​​断言失败时生成异常的选项可以解决问题:可以在调试版本中将其打开,并在发布版本中将其关闭。如果 Apple 不希望包罗万象的做法泛滥,Apple 甚至可以拒绝使用此选项编译的应用程序。
  • 我同意。能够测试你的代码对你来说很重要......我只知道这些东西被滥用了。 :(

标签: swift xctest preconditions


【解决方案1】:

您可以通过仅测试输入满足这些先决条件的行为来测试具有先决条件的 Swift 方法。不满足前提条件时的行为很清楚,无需进一步测试,因为前提条件已被纳入标准库。

如果您怀疑自己是否正确指定了前提条件,可以将前提条件表达式提取到布尔函数中,然后对其进行测试,以正确区分有效输入和无效输入。

但是,您可以在这里为自己创造您想要的:

在前置条件/​​断言失败时生成异常的选项可以解决问题:可以在调试版本中将其打开,并在发布版本中将其关闭。

您可以编写自己的函数,例如 require,而不是调用 Apple 的 precondition。这可以有条件地编译为您希望的行为。然后你可以在任何你使用precondition的地方使用它。

【讨论】:

  • 好吧,这会起作用,除了 preconditionFailurefatalError 返回 Never
猜你喜欢
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多