首先,!
在^
选择时考虑了两个标准:
他们所做的是:!
将描述与测试该描述的代码相关联,并将^
一堆描述、测试、格式注释和其他支持代码连接到一个描述完整测试套件的对象中。
“接受”规范的重点是它们纯粹是功能。可变规范利用可变性来“注册”代码。例如,当您这样做时:
"a test" should {
"succeed" in {
success
}
}
这与任何声明无关。它只是类主体(构造函数)中的一个语句,那么 Specs2 是如何找到它的呢?很简单:当该代码运行时,它会更改值或变量以注册自身。
这是不可变规范不做的事情。通过运行方法找到测试is
,该方法必须返回所有测试的列表。让我们想象一个非常面向对象的非语法糖,这样做的方式:
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)
)
)
)
因此,验收规范是由片段组成的。片段可以通过多种方式组成,例如与某些代码相关联的描述,或其他片段后跟的描述。
它的工作方式非常复杂,可以满足各种需求,例如自动示例、给定的时间规范、正则表达式提取器、部分函数、规范输出的格式等。