Ruby on rails 在Rails环境下运行的Rails隔离测试

Ruby on rails 在Rails环境下运行的Rails隔离测试,ruby-on-rails,testing,stub,stubs,Ruby On Rails,Testing,Stub,Stubs,我目前正在从事一个项目,我们开始将测试迁移到独立测试(没有rails依赖项,并且使用存根和模拟)。 问题是,在隔离所有当前测试之前,我们必须将测试与隔离测试一起运行,这将启动rails环境 当在独立测试中存在一个伪类(class Foo;end;)时,问题就出现了,它将在其余测试中重写原始类 例如: 在foo_spec.rb中,我们有这一行 class Bar; end; 这将覆盖Bar类以进行下一个非隔离测试,并将导致大量失败 为了解决这个问题,我可以想出两种方法: -或者在使用rails环

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

当在独立测试中存在一个伪类(class Foo;end;)时,问题就出现了,它将在其余测试中重写原始类

例如: 在foo_spec.rb中,我们有这一行

class Bar; end;
这将覆盖Bar类以进行下一个非隔离测试,并将导致大量失败

为了解决这个问题,我可以想出两种方法: -或者在使用rails环境运行测试时注释掉假类 -将独立的测试放在另一个文件夹中,并与其他测试分开运行(这样更有意义)

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

我们正在使用rspec(它不应该改变任何东西),我们的rails规范位于
spec
中,它有自己的
spec\u helper.rb
文件,该文件正在加载env和所有丑陋的东西

spec\u fast
文件夹中,我们拥有所有可以在没有rails的情况下运行的规范,它们自己的规范助手只加载我们独立的
lib
文件夹

对于我们的ci服务器,我们允许两个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/rails
spec/fast
,但我没有尝试,因为这意味着要在spec文件中进行大量的路径更改。

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

而不是:

#no
class Foo
   #something
end
相反:

foo = Class.new do
  #stuff
end
您可以随心所欲地使用foo.new或foo.class_方法。也可能在@foo中。但您并没有像普通类定义那样将其分配给常量Foo,而是创建了一个“匿名”类并将其分配给普通变量,其作用域仅限于您需要它的区域内


注意:我并不是说这是用rspec做事情的“正确”方式,我从来都不觉得我知道应该做什么,应该做的事情可能是不创建这样的类,或者使用一些我不理解的奇怪的factorygirl之类的东西。但是,当我需要创建仅针对特定测试或块范围的“虚拟”类型类时,我就是这么做的

谢谢phoet,我认为这可能是处理这个问题的最好方法,因为现在你有一个很好的观点,但是如果在Bar类的实现中有一行写着“Foo.getX”呢?我将无法找到该类,因此在这种情况下,您的方法将不起作用。