我目前正在使用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))))
答案 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)
}