1

次のパターンを持つ Groovy Spock メソッドがあります。

def "My test"() {
  def a = createA();
  assert a.fieldLevel1.isValid()
  def b = a.fieldLevel1
  assert b.fieldLevel2.isValid()
  def c = b.fieldLevel2
  assert c.fieldLevel3.isValid()
  ...
}

ご覧のとおり、アサーションと変数定義が混在しているため、ブロックでそれを分割するのは困難です。そのような種類のテストを書くための「スポック」アプローチは何でしょうか?

アップデート:

テストc.fieldLevel3.isValid()は実際c.fieldLevel3 instanceof Aには次のような構造になっているため、フィールドが無効な場合は続行できません。

4

2 に答える 2

4

単体テストの「古典的な」方法は、テストを統一することです。つまり、テストごとに1 つのことをテストしますが、この例ではそうではないようです。

ただし、expectブロック内のすべてのセットアップ コードの後に​​、ブロック内のすべてのアサーションをグループ化できますsetup

def "My test"() {
  setup:
  def b = createA().fieldLevel1
  def c = b.fieldLevel2
  def d = c.fieldLevel3
  expect:
  b.valid
  c.valid
  d.valid
}

isValid()Groovy の利点を使用して asにアクセスしvalid、そのメソッドを補助オブジェクトで直接呼び出すことによって、アサーションを短縮したことに注意してください。

また、私は通常のwhen/thenSpock ブロックを使用していません。なぜなら、このテスト ケースは、特定のシステムでの刺激/応答とうまく一致しないように思われるからです。ただし、必要に応じて、多くwhenthen交互のブロックを使用することもできます。

def "My test"() {
  when: def b = createA().fieldLevel1
  then: b.valid
  when: def c = b.fieldLevel2
  then: c.valid
  when: def d = c.fieldLevel3
  then: d.valid
}
于 2012-09-11T21:03:41.170 に答える