Techioz Blog

Ruby cucumber cucumber 式を使用して、異なるステップで同じ定義を呼び出す方法

概要

欲しかったと言ってください

Given something
When the sky is blue
And grass is green
Then I'm happy

でも欲しかった

When('the sky is blue') do
puts 'good'
end

そして

When('grass is green') do
puts 'good'
end

まったく同じステップ定義になります。次のようなものになります。

When(('the sky is blue')('grass is green')) do
puts 'good'
end

正規表現ではなく、ruby-cucumber と cucumber 式を使用して、それを機能させるにはどのような構文が必要でしょうか?助けてください

解決策

Cucumber 式を使用してこれを行うことはできるかもしれませんが、人々が奇妙な入力を提供した場合、過剰一致または過小一致のエッジ ケースが存在しないと想定するのは困難です。たとえば、次のような動作が期待できるかもしれません。

( the )sky/grass is blue/green

これは例と一致しますが、「草が青いとき」や「空が緑であるとき」などのテキストとも予期せず一致します。おそらくこれはあなたが望んでいることではありません。一般化できない場合は、より明示的なアンカーリングを備えた正規表現を使用するか、結合ステップを避けるためにガーキンを分割することを検討する必要があるかもしれません。

Gherkin を使用すると、さまざまな方法でトークンを抽出して処理できます。混乱を引き起こすような他の同様の手順がないと仮定すると、Cucumber 構成でカスタム パラメーター タイプを作成しなくても、次の手順は機能するはずです。ニーズに応じて、他のアプローチも機能する可能性があります。

# Gherkin
When the "sky" is "blue"
And "grass" is "green"
Then I am "happy"

# flexible object/color step with cucumber
# expressions and a case statement
When("(the ){word} is {word}") do |obj, color|
  case
  when (obj == "sky" and color == "blue") && 
       (obj == "grass" and color == "green")
    @emotional_state = "happy"
  else
    @emotional_state = "unhappy"
  end
end 

# use state from the previous step to measure
# your happiness quotient
Then("I am {word}") do |emotional_state|
  @emotional_state == emotional_state
end

また、何があなたを幸せにするかについての真理表をより簡単にマッピングできるように、代わりにシナリオの概要を作成したり、データ テーブルを渡したりすることを検討することもできます。目標と、手順が十分に明確でなくなるまで手順を単純化しすぎる可能性によっては、少なくとも正しい方向に進むはずです。