如何使用rspec 2配置集成测试?

时间:2010-12-31 04:50:33

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

我需要为单元测试和集成测试的不同设置设置不同的设置。实施例

对于单元测试,我想做

WebMock.disable_net_connect!(:allow_localhost => true)

对于集成测试,我想做

WebMock.allow_net_connect!

此外,在开始集成测试之前,我想确保启动solr。因此我希望能够致电

config.before(:suite) do
  SunspotStarter.start
end

但是,仅适用于集成测试。如果它是一个单元测试,我不想启动我的solr。

如何将配置分开?现在,我已经通过将我的集成测试保存在spec文件夹之外的文件夹中来解决这个问题,该文件夹有自己的spec_helper。还有更好的办法吗?

2 个答案:

答案 0 :(得分:2)

我的解决方案可能有点hackish,但据我测试它应该有用。

我注意到config.include采用type参数,因此可能 ab 用于执行任意代码块,如下所示:

module UnitTestSettings
  def self.included(base)
    WebMock.disable_net_connect!(:allow_localhost => true)
  end
end

module IntegrationTestSettings
  def self.included(base)
    WebMock.allow_net_connect!

    RSpec.configure do |config|
      config.before(:suite) do
        SunspotStarter.start
      end
    end

  end
end

Rspec.configure do |config|
  config.include UnitTestSettings, :type => :model
  config.include IntegrationTestSettings, :type => :integration
end

将它放在support文件夹中的一个文件中,你应该很高兴,尽管我还没有真正测试过代码。此外,我很确定有更好的方法来实现同样的目标。

答案 1 :(得分:2)

您可以使用与include语句相同的方式为前/后块指定类型。所以你可以做到以下几点:

RSpec.configure do |config|
  config.before(:each, type: :model) do
    WebMock.disable_net_connect!(:allow_localhost => true)
  end

  config.before(:each, type: :request) do
    WebMock.allow_net_connect!
  end

  config.before(:suite, type: :request) do
    SunspotStarter.start
  end
end