在失败的示例之后,防护rspec正在重新运行包含shared_examples的文件,而不是实际的spec文件



我有一个类似spec/features/awesome_feature_spec.rb的功能规范,它需要spec/shared_examples/awesome_spec.rb。后者包含了我在awesome_feature_spec.rb中使用的所有shared_examples。当一个示例失败,我编辑了一个文件来修复并保存它时,guard试图再次运行该示例,但它直接运行awesome_feature.rb而不是awesome_feature_spec.rb,因为失败的共享示例位于awesome_feature.rb中。这当然会导致一个错误,因为它需要运行awesome_feature_spec.rb,这是实际的功能规范。

这就是我的Guardfile的样子:

guard :rspec do
  watch(%r{^spec/.+_spec.rb$})
  watch(%r{^lib/(.+).rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
  watch('spec/spec_helper.rb')  { "spec" }
  # Rails example
  watch(%r{^app/(.+).rb$})                           { |m| "spec/#{m[1]}_spec.rb" }
  watch(%r{^app/(.*)(.erb|.haml|.slim)$})          { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
  watch(%r{^app/controllers/(.+)_(controller).rb$})  { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
  watch(%r{^spec/support/(.+).rb$})                  { "spec" }
  watch('config/routes.rb')                           { "spec/routing" }
  watch('app/controllers/application_controller.rb')  { "spec/controllers" }
  # Capybara features specs
  watch(%r{^app/views/(.+)/.*.(erb|haml|slim)$})     { |m| "spec/features/#{m[1]}_spec.rb" }
  watch(%r{^spec/shared_examples.*/(.+).rb$})      { |m| "spec/features/#{m[1]}_spec.rb" }
  # Turnip features and steps
  watch(%r{^spec/acceptance/(.+).feature$})
  watch(%r{^spec/acceptance/steps/(.+)_steps.rb$})   { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
end

有人能帮我让guard运行功能规范而不是包含共享示例的文件吗?

提前非常感谢:)

编辑:我没有正确阅读这个问题。这并不能解决上面的问题,但如果其他人在谷歌上搜索关于guard rspec只运行失败规范的答案时碰巧遇到这个问题,希望这会有所帮助。


这是guard rsspec的"聚焦模式"功能。它会记住上次运行中任何失败的规格,并一直运行它们,直到它们通过。

要禁用它,请将failed_mode: :none添加到Guardfile:中的RSpec选项中

rspec_opts = {
  failed_mode: :none,
  # other options...
}
guard :rspec, rspec_opts do
  # watches, etc...
end

请参阅:https://github.com/guard/guard-rspec了解更多详细信息。

guard-rspec中已确认问题(https://github.com/guard/guard-rspec/issues/243)。如果将guard-rspec更新到4.5.0版本,则应进行修复。

很抱歉来晚了,但其他人可能会来寻求答案。

我不确定这是否正是您所需要的,但听起来您需要对执行哪些文件进行更细粒度的控制。

条件观察听起来可以给你更好的控制。

语法可以改为稍微不那么详细的语法,但关键是你可以拉入参数,并将它们传递给具有更复杂逻辑的方法,我相信params是一个大小为3的数组,形式为:

["path/to/controller", "controller_name", "controller"]

然而,我已经有一段时间没有设置了,所以你可以通过以下操作来窥探它们。

#add a watch to all view files in the app directory and print the params to stdout
watch(%r{^app/views/(.+)/.*.(erb|haml)$})          { |params| puts params}

然后按照你想要的逻辑行事。

最新更新