如何在Specs2中重用描述*和*匹配器的值?

时间:2011-10-20 13:06:58

标签: scala specs2

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

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

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

还有GivenWhenThen这些内容,但它看起来非常冗长。

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

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

1 个答案:

答案 0 :(得分:2)

当示例的正文非常接近描述时,您可以使用“auto-examples”:

"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版本,您只需reuse the description of an example

 "4 is smaller than 10" !  { (s: String) => 
   s.split(" ").head.toInt must be_<(10) 
 }