【问题标题】:Guard and Cucumber: when I edit a step definition I'd like to only run features that implement this stepGuard and Cucumber:当我编辑步骤定义时,我只想运行实现此步骤的功能
【发布时间】:2012-06-28 07:23:15
【问题描述】:

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

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

这不好。我希望至少只运行那些使用编辑文件中的任何步骤的功能;但如果guard 可以看到当前正在编辑哪个步骤,然后只运行使用此特定步骤的功能,那就更好了。

我猜第一个应该不难完成;第二个似乎是一厢情愿的想法......

【问题讨论】:

    标签: cucumber bdd guard


    【解决方案1】:

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

    每个 Guard 插件都以 guard DSL 方法开头,后跟一个选项哈希来配置 Guard 插件。不同的 Guard 插件的选项通常不同,您必须咨询插件README 了解更多信息。

    guarddo ... end 之间,您通常配置您的观察者。必须使用RegExp 定义观察者,它描述了要观察的文件。我使用Rubular 来测试我的观察者,您可以粘贴从find features 的输出中复制的当前功能,以获得真实文件来测试您的正则表达式。

    线

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

    例如监视features 文件夹中以.feature 结尾的所有文件。由于没有提供给 watcher 的块,匹配的文件原封不动地传递给 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
    

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

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

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

    【讨论】:

    • 一个非常有用的答案,谢谢!我想我将不得不更多地使用黄瓜功能,看看将我的步骤分成单个文件的最佳方法是什么,然后我将能够按照我想要的方式配置守卫。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多