有没有办法配置guard不运行请求规范?

时间:2012-02-25 16:53:47

标签: ruby-on-rails rspec guard

我正在使用后卫运行所有我的轨道规格和它真棒。我写了一堆请求规范,使用capybara和selenium通过打开firefox来测试我的页面javascripts,它们也很棒,但是当我打字的时候,它们往往很慢并且会把焦点拉离我的编辑器。

有没有办法配置后卫在运行全部时不运行我的请求规范,并且可能将热键设置为仅运行请求规范?

2 个答案:

答案 0 :(得分:6)

回答我自己的问题,其他人遇到了这个问题:

rspec-rails可以通过:cli将命令行参数传递给rspec。此外,可以在spec文件中标记示例,然后可以运行rspec以包含或排除那些标记的示例。

原来我已经标记了我想要排除的示例:js => true,这是你如何让Selenium启动firefox。

describe "Post" do
  it "should be able to edit a post", :js=>true do
    # your test here
  end
end

我在我的Guardfile中创建了两个组,一个用于非javascript规范:cli => “-t~js”和另一个用于测试javascript的规范:cli => “-t js”。我也通过了:all_after_pass =>对于javascript组来说是假的。

这是我的新警卫档案:

group 'none-javascript specs' do
  guard 'rspec', :version => 2, :cli => '-r rspec/instafail -f RSpec::Instafail -t ~js'  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|\.jbuilder)$})      { |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" }

   watch(%r{^app/views/(.+)/.*\.(erb|haml)$})          { |m| "spec/requests/#{m[1]}_spec.rb" }
  end
end

group 'javascript specs' do
  guard 'rspec', :version => 2, :all_after_pass => false, :cli => '-r rspec/instafail -f RSpec::Instafail -t js' do

    watch(%r{^app/views/(.+)/.*\.(erb|haml)$})          { |m| "spec/requests/#{m[1]}_spec.rb" }
    watch(%r{^spec/requests/.+_spec\.rb$})
  end
end

现在,当我开始守卫或在守卫术语中命中返回时,两个组都运行执行所有规格。

Guard::RSpec is running, with RSpec 2!
Running all specs
Run options: exclude {:js=>true}
...
Finished in 75.78 seconds
428 examples, 0 failures, 1 pending

Guard::RSpec is running, with RSpec 2!
Running all specs
Run options: include {:js=>true}
...
Finished in 63.68 seconds
22 examples, 0 failures

在所有测试通过后,只运行none-javascript示例。

答案 1 :(得分:5)

exclude有一个guard-rspec选项。它已在#23中实施,但未在README中记录。我做了a pull request to document that

实施例

guard 'rspec', :exclude => "spec/foo/**/*"  # exclude files based on glob