【问题标题】:Rails isolated tests running under rails env在 rails env 下运行的 Rails 隔离测试
【发布时间】:2012-03-22 12:50:29
【问题描述】:

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

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

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

class Bar; end;

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

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

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

【问题讨论】:

    标签: ruby-on-rails testing stub stubs


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 phoet,我认为这可能是目前处理这个问题的最好方法
    【解决方案2】:

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

    代替:

    #no
    class Foo
       #something
    end
    

    改为:

    foo = Class.new do
      #stuff
    end
    

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

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

    【讨论】:

    • 你说得很好,但是如果在 Bar 类的实现中有一行说 'Foo.getX' 怎么办?我将无法找到该类,因此您的方法在这种情况下不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多