1

我刚开始使用 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得到的

非常感谢你。

4

2 回答 2

4

首先,!^选择时考虑了两个标准:

  • 减少视觉混乱
  • 有必要的相对优先级以避免括号

他们所做的是:!将描述与测试该描述的代码相关联,并将^ 一堆描述、测试、格式注释和其他支持代码连接到一个描述完整测试套件的对象中。

“接受”规范的重点是它们纯粹是功能。可变规范利用可变性来“注册”代码。例如,当您这样做时:

"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)
    )
  )
)

因此,验收规范是由片段组成的。片段可以通过多种方式组成,例如与某些代码相关联的描述,或其他片段后跟的描述。

它的工作方式非常复杂,可以满足各种需求,例如自动示例、给定的时间规范、正则表达式提取器、部分函数、规范输出的格式等。

于 2012-06-10T04:51:55.140 回答
3

这很简单。如页面上所写,^构建了一个片段列表。片段可以是字符串、附加代码块的描述(“描述”!块)或控制元素p,如空行。所以你的例子可以读作:

Description("this is my specification") and
  Description("and example 1").withBlock(e1) and
  Description("and example 2").withBlock(e2)

这将被分配为def is =规范类顶部的主体。然后将在内部处理此列表,并且对于每个描述,控制台都会打印一行,并且根据块的结果(如果有的话),它的颜色会有所不同。

总而言之,它构建了一个将由测试运行器处理的项目列表。

于 2012-06-09T11:07:43.847 回答