首先,!
和^
已經選擇了與兩個標準考慮:
他們做什麼必要的相對優先級是:!
同夥描述和測試描述的代碼,以及^
將一組描述,測試,格式化註釋和其他支持代碼連接到一起一個描述完整測試套件的對象。
「驗收」規範的要點是它們是純粹的功能。可變規範利用可變性來「註冊」代碼。例如,當您這樣做時:
"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術語),什麼!
確實將「測試規則」與「測試用例」關聯起來。它有點像下面 - 不完全是,因爲我正在改變東西,使它看起來更像傳統的面向對象。
"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)
)
)
)
所以,接受規範是由片段組成的。片段可以用許多方式組成,例如與某些代碼相關的描述,或者其他片段的描述。
它的工作方式非常複雜,可以滿足各種不同的需求,例如自動示例,給定時間指定,正則表達式提取器,部分函數,規範輸出格式等。