Ruby on rails 在Rails环境下运行的Rails隔离测试
我目前正在从事一个项目,我们开始将测试迁移到独立测试(没有rails依赖项,并且使用存根和模拟)。 问题是,在隔离所有当前测试之前,我们必须将测试与隔离测试一起运行,这将启动rails环境 当在独立测试中存在一个伪类(class Foo;end;)时,问题就出现了,它将在其余测试中重写原始类 例如: 在foo_spec.rb中,我们有这一行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环
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”呢?我将无法找到该类,因此在这种情况下,您的方法将不起作用。