【问题标题】:Organizing rspec 2 tests into 'unit' and 'integration' categories in rails将 rspec 2 测试组织成 Rails 中的“单元”和“集成”类别
【发布时间】:2012-04-05 13:10:24
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我们有相同性质的团体。 然后我们在本地开发盒和 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
    

    【讨论】:

    • 太好了!但是.. 我将文件添加到我的 lib/tasks 中,但出现错误:rake aborted!未初始化的常量 Rspec
    • 这很奇怪,如果你有 Rspec,你应该有它为你工作。
    • 我必须将 rspec-core 添加到 Gemfile 并将 require 'rspec/core/rake_task' 添加到文件中。奇怪的是,我认为拥有 rspec-rails 会包含这些依赖项。
    • 有一个错字,至少我的设置应该是“RSpec::Core::RakeTask”,而不是“Rspec::...”
    • 明确地说,文件应该位于lib/tasks/spec.rake
    【解决方案2】:

    一种方法是像这样标记您的 RSpec 测试用例:

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

    当你执行你的测试用例时,使用这个:

    rspec . --tag integration
    

    这将执行所有带有标签:integration => true 的测试用例。更多信息请参考page

    【讨论】:

    • 谢谢。有没有办法在不带参数运行rspec 命令时排除这些“集成”情况?
    • rspec 。 --tag ~整合。如果您使用的是 zsh ,那么它会略有不同: rspec 。 --tag "~集成"
    • @Evgenii:您也可以将--tag "~integration" 放入您的项目.rpsec 文件中。这是我的首选方法。当然,它会被您可能在命令行上明确指定的选项所覆盖,因此您仍然拥有完全的灵活性。
    【解决方案3】:

    我必须按如下方式配置我的 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

    【讨论】:

    • 为什么不将单元测试存储在单独的目录中(例如spec/unit),并使用不太复杂的模式(例如spec/unit/**/*_spec.rb)?
    【解决方案4】:

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

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

    但是如果你只把它放在 :test group only下,

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

    然后你会得到上面的错误。

    HTH

    【讨论】:

      【解决方案5】:

      我建议使用.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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多