【问题标题】:Scalatest: Combine AssertionsScalatest:组合断言
【发布时间】:2021-06-16 05:23:12
【问题描述】:

我刚刚开始使用 WordSpec,但遇到了一个无法解决的问题。

我想在一个单元测试中断言两个不同的值。假设我有val result1val result2,我需要第一个取特定值,第二个取另一个特定值。

如果可以对断言进行连接/减少/折叠,这将非常容易,但我认为我不能。也许是这样的:

result1 should be (1) ++ result2 should be (2)

结果将是一个新的断言,只有当两个断言都为真时才为真。

如果我把它们写成如下,它只会取最后一个值。

result1 should be (1)
result2 should be (2)

有人知道解决这个问题的方法吗?

【问题讨论】:

  • 如果你一个接一个地添加一个断言,它会同时检查它们,所以我不太明白你的问题。你可以试试(result1, result2) shouldBe (1,2)
  • AFAIK scalatest 执行所有断言。因此,您可以按照向他们展示的方式编写它。 ScalaTest 是一个非常复杂的 DSL,它不像大多数 scala 函数那样工作,只是返回 las 值。
  • @LuisMiguelMejíaSuárez 你如何获得最大规模的执行所有断言?我的 scalatests 在遇到第一个失败的断言后停止。我能找到运行所有断言的唯一方法是将断言包装在Checkpoint 中。你做了什么?
  • @skrueger 这就是重点,它将开始运行所有这些并返回第一个失败。

标签: scala testing scalatest


【解决方案1】:

对于 ScalaTest 3.0.1,我看到的两个选项是:

1.) 使用元组(正如@krzysztof-atłasik 评论的那样)

(result1, result2) should be (1, 2)

2.) 使用Checkpoint

val cp = new Checkpoint()

cp { result1 should be (1) }
cp { result2 should be (2) }

cp.reportAll()

类检查点,它允许在测试中执行多个断言,任何失败都会累积并在测试结束时一起报告。

-- ScalaTest 的检查点scaladoc

就我个人而言,我喜欢Checkpoint,因为它可以更好地区分所断言的内容。但是,我发现一个潜在的缺点是,与返回 Assertionshould be (x) 不同,Checkpoint#reportAll() 返回 Unit。我有一个方法需要返回Assertion,而我使用的解决方法是返回org.scalatest.Succeeded

例如,

def someMethod(): Assertion = {
  ...
  cp.reportAll()
  Succeeded
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-10
    • 2016-05-14
    • 2014-11-16
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多