0

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

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

示例:在 foo_spec.rb 我们有这一行

class Bar; end;

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

为了摆脱这种情况,我可以想出两种方法: - 在使用 rails env 运行测试时注释掉假类 - 将隔离的测试放在另一个文件夹中并将它们与其他文件夹分开运行(这将使更多感觉)

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

4

2 回答 2

0

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

代替:

#no
class Foo
   #something
end

反而:

foo = Class.new do
  #stuff
end

您可以随心所欲地使用 foo.new 或 foo.class_method。也可以在@foo 中。但是您不会像普通类定义那样将它分配给常量 Foo ,而是创建一个“匿名”类并将其分配给一个普通变量,其范围仅限于您需要它的区域内。

注意:我并不是说这是用 rspec 做事的“正确”方式,我从不觉得我知道正确的做法,正确的做法可能是以某种方式根本不创建这样的类,或者使用一些我不明白的奇怪的工厂女孩​​的东西。但是当我需要为特定测试或块的范围创建“虚拟”类型类时,这就是我所做的。

于 2012-03-22T15:47:13.767 回答
0

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

spec_fast文件夹中,我们拥有所有可以在没有轨道的情况下运行的规范,以及它们自己的规范助手,只加载我们的独立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但我没有尝试过,因为这意味着在规范文件中进行大量路径更改。

于 2012-03-22T14:54:41.643 回答