将rspec 2测试组织到rails中的“单元”和“集成”类别中

时间:2012-04-05 13:10:24

标签: ruby-on-rails-3 testing rspec2

如何将rspec 2测试组织成'单元'(快速)和'集成'(慢)类别?

  • 我希望能够使用rspec命令运行所有单元测试,而不是“集成”测试。
  • 我希望能够只运行'整合'测试。

5 个答案:

答案 0 :(得分:19)

我们有相同性质的团体。 然后我们在本地开发盒和CI上逐一运行。

你可以简单地做

bundle exec rake spec:unit
bundle exec rake spec:integration
bundle exec rake spec:api

这就是我们的spec.rake看起来像

  namespace :spec do
    RSpec::Core::RakeTask.new(:unit) do |t|
      t.pattern = Dir['spec/*/**/*_spec.rb'].reject{ |f| f['/api/v1'] || f['/integration'] }
    end

    RSpec::Core::RakeTask.new(:api) do |t|
      t.pattern = "spec/*/{api/v1}*/**/*_spec.rb"
    end

    RSpec::Core::RakeTask.new(:integration) do |t|
      t.pattern = "spec/integration/**/*_spec.rb"
    end
  end

答案 1 :(得分:9)

一种方法是标记RSpec测试用例,如下所示:

it "should do some integration test", :integration => true do
  # something
end

执行测试用例时请使用:

rspec . --tag integration

这将使用标记:integration => true执行所有测试用例。有关更多信息,请参阅此page

答案 2 :(得分:1)

我必须按如下方式配置我的unitfeature测试:

require 'rspec/rails'

namespace :spec do
  RSpec::Core::RakeTask.new(:unit) do |t|
    t.pattern = Dir['spec/*/**/*_spec.rb'].reject{ |f| f['/features'] }
  end

  RSpec::Core::RakeTask.new(:feature) do |t|
    t.pattern = "spec/features/**/*_spec.rb"
  end
end

必须在@KensoDev给出的答案中添加require 'rspec/rails'并将Rspec更改为RSpec

答案 3 :(得分:0)

请注意https://github.com/rspec/rspec-rails,他们告诉您将gem放在“group:development,:test”之下,就像这样,

group :development, :test do
  gem 'rspec-rails', '~> 2.0'
end

但如果您只将其放在:测试组

group :test do
  gem 'rspec-rails', '~> 2.0'
end

然后你会得到上述错误。

HTH

答案 4 :(得分:0)

我建议使用.rspec文件来配置模式而不是使用rake,因为在使用rake时将标志传递给RSpec很棘手。

您可以在.rspec文件中阅读环境变量:

<%= if ENV['TEST'] == 'integration' %>
--pattern spec/integration/**/*_spec.rb
<% else %>
<% ENV['TEST'] = 'unit' %>
--pattern spec/unit/**/*_spec.rb
<% end %>

然后,您可以运行TEST=integration rspec来运行集成测试,或只运行rspec来运行单元测试。这种方法的优点是你仍然可以将标志传递给它,如:

TEST=integration rspec -t login -f doc