3

Specs2 在处理验收规范(如果我们想要的话甚至是单元规范)时提升了函数式风格。

规范Specs2 哲学中提到了使用旧样式(可变样式)的风险,并涉及潜在的不良副作用:

需要了解的重要事项是:

副作用仅用于构建规范片段,通过改变变量它们还用于在出现故障时(通过抛出异常)短路示例的执行。如果您在示例主体中构建片段或同时执行相同的规范,那么天应该塌下来。“上下文”管理将通过案例类或特征完成(参见 org.specs2.examples.MutableSpec)

我不知道如何同时运行相同的规范,因为每个规范都与另一个不同(分离的类的实例),即使我们同时运行相同的两次或更多次。

确实,specFragments(可变变量):

protected[mutable] var specFragments: Fragments = new Fragments()

a trait在被调用中声明FragmentBuilder,而不是在object(在scala意义上=>单例)或其他共享事物中......,每个实例specFragments的局部变量也是如此。Specification

那么什么情况下可能会冒并发机制的风险呢?

我并没有真正想出一个真实的场景(非愚蠢)来证明 Specs2 功能风格的好处。

4

1 回答 1

5

可变规范的问题只能在规范构建时看到,而不是在执行时看到。在构建可变规范时,很容易产生意想不到的副作用

import org.specs2._

val spec = new mutable.Specification {
  "example" >> ok
}
import spec._

def addTitle {
  // WHOOPS, forgot to remove this line!
  // test, add also an example
  "this is only for testing" >> ok

  "new title".title
}
addTitle

输出是:

new title

+ example
+ this is only for testing

Total for specification new title
Finished in 0 ms
2 examples, 0 failure, 0 error

所以,你是对的,指南中突出显示的句子(“同时执行相同的规范”)是模棱两可的。如果多个线程正在构建相同的规范对象,但如果它们正在运行它(在该句子中整个过程被称为“执行”),则规范本身的构造可能是不安全的。

您的另一个问题是:“功能风格”有什么好处?从用户的角度来看,主要的好处是它是另一种编写规范的风格,所有文本都放在第一位,所有代码都放在其他地方。

总之,如果您喜欢 Specification 的可变风格,请不要害怕!

于 2013-01-23T21:54:37.037 回答