Techioz Blog

Cucumber DSL はどのように機能しますか?

概要

見てみましょう:

When /^(?:|I )fill in the following:$/ do |fields|
  fields.rows_hash.each do |name, value|
    When %{I fill in "#{name}" with "#{value}"}
  end
end

私の初歩的な Ruby の知識では、When は正規表現とブロックを受け取るメソッド呼び出しであると考えていました。

しかし、これはメソッド呼び出しではなく定義であるとも考えていますが、では、それはどのように実現されるのでしょうか?いつ何かを定義できるでしょうか?

解決策

コードは次のとおりです(コードはここから引用)。

def register_rb_step_definition(regexp, symbol = nil, options = {}, &proc)
  proc_or_sym = symbol || proc
  RbDsl.register_rb_step_definition(regexp, proc_or_sym, options)
end

When、Given、Then は register_rb_step_development のエイリアスです。 引数として正規表現とブロックを渡します。

各ステップ定義は正規表現とブロックで登録されます。テストが実行されると、cucumber は以前に登録されたステップを調べ、一致する正規表現があれば、その正規表現に関連付けられたブロックを実行します。