黄瓜 DSL 是如何工作的?

How does Cucumber DSL work?

让我们采取:

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 是一个采用正则表达式和块的方法调用。

但是,我也在想这是一个定义,而不是一个方法调用,但是它是如何实现的呢? When 如何定义某些东西?

代码如下(代码取自here):

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

WhenGivenThenregister_rb_step_definition 的别名。 您传递一个正则表达式作为参数和一个块。

每个步骤定义都注册了正则表达式和块。执行测试时,cucumber 会查看之前注册的步骤,如果有任何正则表达式匹配,它就会执行与该正则表达式关联的块。