2

我目前正在使用|>scalaz 来实现以下目标:

(4 |> (s => (s + " is smaller than 10" ! (s < 10 must beTrue)))

这允许我.toString在测试用例的描述中重用对象的。但是由于 Specs2 似乎支持某种复杂的东西,比如通过扫描src文件夹从测试源中提取东西——他们一定考虑过这个特殊的用例。

还有Given, When,Then东西,但它看起来非常冗长。

那么如何重用相同的对象进行描述和匹配?我认为我的解决方案是可以接受的,但括号困扰着我。实际上它看起来像这样:

(Set((1,2),(3,4)) |> (s => s + " has Set(1,2) as component of 1" ! (graph.componentOf(s,1) must_== Set(1,2)))) 
4

1 回答 1

2

当示例的主体与描述非常接近时,您可以使用“自动示例”:

"some examples"     ^
{ 4 must be_<(10) } ^
{ 5 must be_<(10) }

在这种情况下,使用 sbt 执行时,示例的主体直接用作描述:

[info] some examples
[info] + 4 must be_<(10)
[info] + 5 must be_<(10)

请注意,我将期望写为,4 must be_<(10)而不是(4 < 10) must beTrue因为如果出现问题,失败消息将更加明确:

14 is not less than 10
        vs
the value is false

如果您想使用更多信息来增强失败消息,您还可以使用aka运算符:

 (4 < 10) aka "four < ten" must beTrue

最后,还有一个更简单的 Given-When-Then 版本,您可以在其中简单地重用示例的描述

 "4 is smaller than 10" !  { (s: String) => 
   s.split(" ").head.toInt must be_<(10) 
 }
于 2011-10-20T22:34:25.950 回答