次のロジックを実装する必要があります。
- 何かをする
- ロジックをチェック
- 他のことをする
- 同様のチェックロジック
簡単なテストにはwhen
/ブロックを使用しました。then
しかし、より複雑なもの(上記のようなもの)を実装する方法が本当にわかりません+コードをできるだけ再利用したいと思います。ただし、ブロックを使用すると、実装がより複雑になります
Spock でコードを再利用するには、いくつかの方法があります。
機能レベル setup: ブロック内にクロージャーを作成します。この機能だけで利用できるメソッドのように扱うことができます。
def "test"() {
setup:
def containsCat = {String it -> it.contains('cat')}
expect:
!containsCat('I love my dog')
containsCat('I love my cat')
}
def "test that cannot reference containsCat(String)"() {
// Test stuff
}
仕様 クラス レベル @Shared クロージャを使用することは可能ですが、ヘルパー ロジックが 1 行または 2 行にすぎない限り、プライベート ヘルパー メソッドを使用することをお勧めします。
class tester extends Specification {
@Shared
def containsDog = {String it -> it.contains('dog')}
private containsCat(String inputString) {
inputString.contains('cat')
}
def "test"(String myPet) {
expect: containsCat(myPet)
where: myPet = 'I love my cat'
}
def "test2"() {
expect: containsDog(mySistersPet)
where: mySistersPet = 'I love my dog'
}
パッケージ レベル
ミニチュア テスト フレームワークを共有することでメリットが得られるクラスのグループがあります。私の好みは、特性を使用することです。機能テスト自体を除くすべてのコードを保持できます。特性がテスト自体からデータを参照する場合は、必ず抽象メソッドを作成して、特性がデータへの参照を保証するようにしてください。
trait petTester {
private containsDog(String inputString) {
inputString.contains('dog')
}
private containsCat(String inputString) {
inputString.contains('cat')
}
}
class myPetTester extends Specification implements petTester {
def "test"(String myPet) {
expect: containsCat(myPet)
where: myPet = 'I love my cat'
}
}
class mySistersPetTester extends Specification implements petTester {
def "test2"() {
expect: containsDog(mySistersPet)
where: mySistersPet = 'I love my dog'
}
}
あなたも使うことができますinteraction { doStuff() }
。
ただし、doStuff() が大きく、多くのテストで同じ相互作用メソッドが使用されていることがわかった場合は、実稼働クラスの一部のコードを別のクラスに移動して、テスト中のクラスは、新しいクラスを呼び出します。
いくつかのパラメーターを変更するだけで、同じテストを 2 回実行したい場合は、次を使用できますwhere
。
def "foo"(Boolean barIsEnabled) {
when:
myService.testBar(barIsEnabled)
then:
myService.readBar() == "123456"
where: "this code shoud work with bar enabled or disabled"
barIsEnabled | ignored
true | _
false | _
}
参照: http://spockframework.github.io/spock/docs/1.0/data_driven_testing.html
ロジックを再利用したいだけの場合はthen
、プライベート メソッドを作成し、そのassert
中に多くのメソッドを追加します。
def "foo"() {
when:
def pc = shop.buyPc()
then:
matchesPreferredConfiguration(pc)
}
void matchesPreferredConfiguration(pc) {
assert pc.vendor == "Sunny"
assert pc.clockRate >= 2333
assert pc.ram >= 4096
assert pc.os == "Linux"
}
参照: http://spockframework.github.io/spock/docs/1.0/spock_primer.html#_helper_methods