【问题标题】:How do you create a Guard configuration watch that will only run the test file that was changed?如何创建一个仅运行已更改的测试文件的 Guard 配置监视?
【发布时间】:2013-02-27 22:59:42
【问题描述】:

没有太多关于如何在线执行此操作的信息,但在我的 Guardfile 中,我正在为我希望 Guard 监视更改的各种目录/文件设置watch。如何为已更新的已更改 spec/test 文件指定监视,并且仅在发生这种情况时运行该特定文件?谢谢!

guard 'rspec' do
  watch(%r|^spec/.+_spec\.rb$|)               { "spec" }
end

当前,当spec 目录下的文件发生更改时,上述运行所有规范/测试。但我只想运行更改后的测试文件的测试。

当前spec 目录树:

spec
 -models
  -user_spec.rb
  -classroom_spec.rb
 -controllers
  -classroom_spec.rb
 -lib
  -support_spec.rb

谢谢!

【问题讨论】:

    标签: rspec guard


    【解决方案1】:

    Guard RSpec 插件有一个演示 Guardfile,您可以使用它来创建

    $ bundle exec guard init rspec
    

    内容如下:

    # A sample Guardfile
    # More info at https://github.com/guard/guard#readme
    
    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)$})                 { |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)$})          { |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' do
      watch(%r|^spec/.+_spec\.rb$|)
    end
    

    这将为 spec 文件夹中以 _spec.rb 结尾的每个修改文件触发 RSpec 插件。

    监视表达式的块用于将文件名转换为其他内容,黑色的参数是正则表达式的匹配项,因此您可以为其添加一些特殊逻辑。演示这一点的简短示例:

    watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
    

    lib/file.rb 中的文件更改将触发插件,并且该块将该文件名转换为 spec/lib/file_spec.rb,因为 m[1] 包含来自 RegExp 的匹配组,即 file

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-18
      • 2013-07-01
      • 2011-11-17
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      相关资源
      最近更新 更多