我正在开发一个项目,我们开始将测试迁移到隔离测试(没有rails依赖,并使用存根和模拟)。 问题是,在所有当前测试被隔离之前,我们必须将测试与隔离测试一起运行,这将启动rails环境。
问题出现时,在隔离测试中,有一个假类(类Foo; end;),它将覆盖其余测试的原始类。
实施例: 在foo_spec.rb中我们有这一行
class Bar; end;
这将覆盖下一个非隔离测试的Bar类,并会导致很多失败。
我可以通过两种方法来摆脱这种情况: - 使用rails env运行测试时注释掉假类 - 将隔离的测试放在另一个文件夹中并将它们与其余文件分开运行(这会更有意义)
你能想出一个更好的方法来解决这个问题吗?
答案 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/rails
和spec/fast
,但我没有尝试,因为它意味着在spec文件中进行大量的路径更改。
答案 1 :(得分:0)
我不知道它是否正确,但我最终并没有将这样的上下文虚拟手动创建的虚拟类分配给常量。
而不是:
#no
class Foo
#something
end
相反:
foo = Class.new do
#stuff
end
你可以foo.new或foo.class_method到你的内心。也可以在@foo。但是你并没有像普通的类定义那样将它分配给常量Foo,而是创建一个“匿名”类并将其分配给普通变量,并将其限定在您需要的区域内。
注意:我不是说这是用rspec做事的“正确”方式,我从来没有觉得我知道正确的事情,正确的做法可能是某种程度上不能创建像这样的类,或使用一些我不理解的奇怪的工厂女孩的东西。但是当我需要在特定测试或块的范围内创建“虚拟”类型类时,这就是我所做的。