Scala 中的 "Power assert" 类似于 Groovy?
Something like "Power assert" in Scala similar to Groovy?
我想知道是否有什么东西可以给我类似 Groovy 的 nice power assert 语句的结果。
> assert ["1", '2']*.size() == [2, 3]
Result: Assertion failed:
assert ["1", '2']*.size() == [2, 3]
| |
[1, 1] false
据我所知,无论是在语言还是在
scalatest
,我目前正在使用。
但也许有人可以建议一些边库这样做?这是一个宠物项目,所以实验性的和没有得到很好支持的库很好。
编辑: 我知道匹配器(最大的匹配器,甚至是普通的java hamcrest 匹配器)。我发现他们写起来冗长而且他们的输出缺乏细节。
上面的示例显示了中间计算步骤,便于检测错误。它向您展示了测试代码的更多详细信息。
我预计,引入此类行为将需要在运行时获得有关表达式 AST 的信息。但我想,这些信息可以是 "baked" 使用宏的编译时间。
即如果我们有表达式 assert a + b == c
scala(或我正在寻找的一些宏扩展)可以将其重写为:
if (!(a + b == c)) {
// detailed message is
// compute a
// compute b
// compute a + b
// compute c
// compute a + b == c
// Make it pretty.
throw new AssertionFailedException(prettyDetailedMessage)
}
所以我正在查看它是否已经实施,如果是 - 在哪里。
Specs2 匹配器在处理错误消息方面做得很好:
class Specs2Specification extends Specification {
"specs2 assertion" should {
"fail" in {
List("1", "2").map(_.length) must_=== List(2, 3)
}
}
}
运行 输出:
[info] Specs2Specification
[info]
[info] specs2 assertion should
[error] x fail
[error] List(1, 1) is not equal to List(2, 3)
[info]
[error] Added (2)
[error] 1
[error] 1
[info]
[error] Missing (2)
[error] 2
[error] 3
或
List("1", "2").map(_.length) must contain(exactly(2, 3)).inOrder
产生
[error] x fail
[error] the values 2, 3 are not in order
有 lots of them 个,您可以创建自定义的。
您的 groovy
代码片段直接翻译为以下 scala
代码(假设您已经在使用 scalatest
):
assert((List("1", "2") map (_.length)) === List(2, 3))
它产生以下错误消息:
*** FAILED ***
List(1, 1) did not equal List(1, 3)
在 ScalaTest 中,您可以使用 DiagrammedAssertions。
参见 http://www.scalatest.org/release_notes/2.2.0#diagrammedAssertions
这是基于 Expecty,它是 Spock 功率断言的基于宏的实现。参见 https://github.com/pniederw/expecty
我想知道是否有什么东西可以给我类似 Groovy 的 nice power assert 语句的结果。
> assert ["1", '2']*.size() == [2, 3]
Result: Assertion failed:
assert ["1", '2']*.size() == [2, 3]
| |
[1, 1] false
据我所知,无论是在语言还是在
scalatest
,我目前正在使用。
但也许有人可以建议一些边库这样做?这是一个宠物项目,所以实验性的和没有得到很好支持的库很好。
编辑: 我知道匹配器(最大的匹配器,甚至是普通的java hamcrest 匹配器)。我发现他们写起来冗长而且他们的输出缺乏细节。
上面的示例显示了中间计算步骤,便于检测错误。它向您展示了测试代码的更多详细信息。
我预计,引入此类行为将需要在运行时获得有关表达式 AST 的信息。但我想,这些信息可以是 "baked" 使用宏的编译时间。
即如果我们有表达式 assert a + b == c
scala(或我正在寻找的一些宏扩展)可以将其重写为:
if (!(a + b == c)) {
// detailed message is
// compute a
// compute b
// compute a + b
// compute c
// compute a + b == c
// Make it pretty.
throw new AssertionFailedException(prettyDetailedMessage)
}
所以我正在查看它是否已经实施,如果是 - 在哪里。
Specs2 匹配器在处理错误消息方面做得很好:
class Specs2Specification extends Specification {
"specs2 assertion" should {
"fail" in {
List("1", "2").map(_.length) must_=== List(2, 3)
}
}
}
运行 输出:
[info] Specs2Specification
[info]
[info] specs2 assertion should
[error] x fail
[error] List(1, 1) is not equal to List(2, 3)
[info]
[error] Added (2)
[error] 1
[error] 1
[info]
[error] Missing (2)
[error] 2
[error] 3
或
List("1", "2").map(_.length) must contain(exactly(2, 3)).inOrder
产生
[error] x fail
[error] the values 2, 3 are not in order
有 lots of them 个,您可以创建自定义的。
您的 groovy
代码片段直接翻译为以下 scala
代码(假设您已经在使用 scalatest
):
assert((List("1", "2") map (_.length)) === List(2, 3))
它产生以下错误消息:
*** FAILED ***
List(1, 1) did not equal List(1, 3)
在 ScalaTest 中,您可以使用 DiagrammedAssertions。 参见 http://www.scalatest.org/release_notes/2.2.0#diagrammedAssertions
这是基于 Expecty,它是 Spock 功率断言的基于宏的实现。参见 https://github.com/pniederw/expecty