5

我正在使用警卫来运行我所有的 Rails 规格,它很棒。我已经编写了一堆使用 capybara 和 selenium 通过打开 firefox 来测试我的页面 javascripts 的请求规范,它们也很棒,但是它们往往很慢,并且在我打字时将注意力从我的编辑器上移开。

有没有办法将警卫配置为在全部运行时不运行我的请求规范,并可能分配一个热键来运行请求规范?

4

2 回答 2

6

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

rspec-rails 可以通过 :cli 将命令行参数传递给 rspec。此外,可以在规范文件中标记示例,然后可以运行 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 中创建了两组,一组用于使用 :cli => "-t ~js" 的非 JavaScript 规范,另一组用于使用 :cli => "-t js" 测试 javascript 的规范。我还为 javascript 组传入了 :all_after_pass => false 。

这是我的新保护文件:

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

毕竟测试通过只运行非javascript示例。

于 2012-02-26T18:02:50.363 回答
5

有一个exclude选项guard-rspec。它在#23中实现,但没有记录在README中。我已经提出了一个拉取请求来记录它

例子

guard 'rspec', :exclude => "spec/foo/**/*"  # exclude files based on glob
于 2013-03-12T15:27:28.870 回答