Rails隔离测试在rails env下运行

时间:2012-03-22 12:50:29

标签: ruby-on-rails testing stub stubs

我正在开发一个项目,我们开始将测试迁移到隔离测试(没有rails依赖,并使用存根和模拟)。 问题是,在所有当前测试被隔离之前,我们必须将测试与隔离测试一起运行,这将启动rails环境。

问题出现时,在隔离测试中,有一个假类(类Foo; end;),它将覆盖其余测试的原始类。

实施例:  在foo_spec.rb中我们有这一行

class Bar; end;

这将覆盖下一个非隔离测试的Bar类,并会导致很多失败。

我可以通过两种方法来摆脱这种情况: - 使用rails env运行测试时注释掉假类 - 将隔离的测试放在另一个文件夹中并将它们与其余文件分开运行(这会更有意义)

你能想出一个更好的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

我们正在使用rspec(不应更改任何内容),并将我们的rails规范放在spec中,并使用自己的spec_helper.rb文件加载env和所有丑陋的东西。

spec_fast文件夹中,我们拥有可以在没有rails的情况下运行的所有规范,它们自己的spec-helper只加载我们独立的lib文件夹。

对于我们的ci-server,我们让两个spec文件夹在不同的任务中运行:

if Rails.env.test?
  require 'rspec/core/rake_task'
  require 'ci/reporter/rake/rspec'

  RSpec::Core::RakeTask.new(:all_fast) do |t|
    t.pattern = 'spec_fast/**/*_spec.rb'
  end

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

  task :all => ["ci:setup:rspec", :all_fast, :all_slow]
end

也应该可以将它们放入单独的子文件夹,如spec/railsspec/fast,但我没有尝试,因为它意味着在spec文件中进行大量的路径更改。

答案 1 :(得分:0)

我不知道它是否正确,但我最终并没有将这样的上下文虚拟手动创建的虚拟类分配给常量。

而不是:

#no
class Foo
   #something
end

相反:

foo = Class.new do
  #stuff
end

你可以foo.new或foo.class_method到你的内心。也可以在@foo。但是你并没有像普通的类定义那样将它分配给常量Foo,而是创建一个“匿名”类并将其分配给普通变量,并将其限定在您需要的区域内。

注意:我不是说这是用rspec做事的“正确”方式,我从来没有觉得我知道正确的事情,正确的做法可能是某种程度上不能创建像这样的类,或使用一些我不理解的奇怪的工厂女孩​​的东西。但是当我需要在特定测试或块的范围内创建“虚拟”类型类时,这就是我所做的。