Guard和Cucumber:当我编辑步骤定义时,我只想运行实现此步骤的功能

时间:2012-06-28 07:23:15

标签: cucumber bdd guard

我已经阅读了主题Guardfile for running single cucumber feature in subdirectory?,这很有效:当我更改某个功能时,只会由后卫运行。

但是在另一个方向它不起作用:当我编辑任何步骤定义文件时,始终所有功能都会运行,无论他们是否使用任何步骤在步骤定义文件中,是否。

这不太好。我想至少只运行那些使用编辑文件中任何步骤的功能;但更好的是,如果后卫可以看到当前编辑的步骤,然后只运行使用此特定步骤的功能。

我想,第一个不应该那么难。第二个似乎是愿意思考...

1 个答案:

答案 0 :(得分:1)

要掌握Guard并为项目和自己的需求提供完美的设置,您必须更改Guardfile并相应地配置watchers。每个Guard插件附带的模板都会尝试匹配大多数用户最有用的行为,这可能与您的个人偏好不同。

每个Guard插件都以guard DSL方法开头,后跟一个选项哈希来配置Guard插件。对于不同的Guard插件,选项通常是不同的,您必须查阅插件README以获取更多信息。

guard区块do ... end之间通常配置您的观察者。必须使用RegExp定义观察程序,该Rubular描述要监视的文件。我使用find来测试我的观察者,您可以粘贴从find features的输出复制的当前功能,以获得真实的文件来测试您的RegExp。

该行

watch(%r{features/.+\.feature})

例如,监视features文件夹中以.feature结尾的所有文件。由于没有为观察者提供阻止,匹配的文件将未经修改地传递给Guard :: Cucumber以便运行。

守望者

watch(%r{features/support/.+})          { 'features' }

匹配features/support目录中的所有文件,因为该块始终返回features,每次支持目录中的文件发生更改时,features都会传递给Guard :: Cucumber,因此所有功能都已完成。

最后一行

watch(%r{features/step_definitions/(.+)_steps\.rb}) do |m| 
  Dir[File.join("**/#{m[1]}.feature")][0] || 'features'
end

监视在_steps.rb dierctory中以features/step_definitions结尾的每个文件,并尝试匹配步骤定义的功能。请注意RegExp features/step_definitions/(.+)_steps\.rb中的括号。这定义了一个匹配组,稍后在观察程序块中可用。例如,步骤定义features/step_definitions/user_steps.rb将匹配,第一个匹配组(m[1])将包含值user

现在,我们尝试{{3}}所有子目录(**)中名为user.feature的匹配文件。如果是这种情况,则运行第一个匹配文件([0]),或者如果找不到任何内容,则运行所有features

所以看起来你的命名步骤与默认的Guard :: Cucucmber Guardfile期望的命名不同,这完全没问题。只需更改观察者以符合您的命名约定。