我刚开始使用Scala和Spec2。但是,我对spec2中的接受风格有点混淆。
有人可以向我解释一下它的功能是什么!和^在这种情况下。我已阅读文档,我仍然不太明白。我理解单元测试模式,但这部分对我来说真的很难理解。
"this is my specification" ^
"and example 1" ! e1^
"and example 2" ! e2
def e1 = success
def e2 = success
这个例子我是从http://etorreborre.github.com/specs2/guide/org.specs2.guide.Structure.html
得到的非常感谢。
答案 0 :(得分:4)
首先,选择!
和^
并考虑两个标准:
他们做的是:!
将描述与测试该描述的代码相关联,^
将一堆描述,测试,格式化注释和其他支持代码连接到描述的对象中完整的测试套件。
“接受”规范的要点是它们纯粹是功能性的。可变规范利用可变性来“注册”代码。例如,当您这样做时:
"a test" should {
"succeed" in {
success
}
}
这与任何声明无关。它只是类(构造函数)体中的一个语句,那么Specs2如何找到它呢?简单:当代码运行时,它会更改值或变量以自行注册。
这是不可变的规范不能做的事情。通过运行方法is
找到测试,该方法必须返回所有测试的列表。让我们想象一个非常OO,非语法的糖,这样做的方式:
def is = List(
new TestCase("A Test", new TestRule("succeed", success)),
new TestCase("Another test", new TestRule("not fail", success))
)
那么,^
方法的作用是加入“测试用例”(可以这么说 - 不是实际的Specs2术语),!
做的是将“测试规则”与“测试用例”。它有点像下面 - 不完全是,因为我正在改变东西,使它看起来更像传统的OO。
"this is my specification" ^
"and example 1" ! e1^
"and example 2" ! e2
new ExampleDescription("this is my specification") ^
new ExampleDescription("and example 1") ! e1^
new ExampleDescription("and example 2") ! e2
// an "Example" is a subclass of "Fragment"
new ExampleDescription("this is my specification") ^
new Example(new ExampleDescription("and example 1"), e1) ^
new Example(new ExampleDescription("and example 2"), e2)
new Fragment(
new ExampleDescription("this is my specification"),
List(
new Example(new ExampleDescription("and example 1"), e1),
new Example(new ExampleDescription("and example 2"), e2)
)
)
new Fragments(
new Fragment(
new ExampleDescription("this is my specification"),
List(
new Example(new ExampleDescription("and example 1"), e1),
new Example(new ExampleDescription("and example 2"), e2)
)
)
)
因此,验收规范由片段组成。片段可以通过多种方式组合,例如与某些代码相关的描述,或者其他片段后面的描述。
它的工作方式非常复杂,可以满足各种需求,例如自动示例,当时给定的规范,正则表达式提取器,部分函数,规范输出格式等等。
答案 1 :(得分:3)
这很简单。正如页面^
上所写,构建了一个片段列表。片段可以是字符串,附加代码块的描述(“description”!block)或控件元素(如p
)作为空行。所以你的例子可以理解为:
Description("this is my specification") and
Description("and example 1").withBlock(e1) and
Description("and example 2").withBlock(e2)
这将被指定为spec类顶部def is =
的正文。在内部,此列表将被处理,并且对于每个描述,将在控制台上打印一行,并且根据块的结果(如果有的话),它将以不同的颜色着色。
总而言之,它构建了一个将由测试运行者处理的项目列表。