【发布时间】:2019-01-25 22:24:21
【问题描述】:
我正在尝试对具有调用 Rails 模型上的类方法的方法的普通旧 Ruby 对象进行单元测试。 Rails 应用程序非常大(加载需要 10 秒),所以我宁愿避免加载所有 Rails 来进行应该在 1 秒内运行的单元测试。
例子:
class Foo
def bar
SomeRailsModel.quxo(3)
end
end
RSpec.describe Foo do
let(:instance) { Foo.new }
it 'calls quxo on SomeRailsModel' do
expect(SomeRailsModel).to receive(:quxo)
instance.bar
end
end
这里的问题是我需要require 'rails_helper' 来加载Rails 以便app/models/some_rails_model 可用。由于 Rails 的依赖,这会导致单元测试缓慢。
我尝试在本地定义常量,然后使用常规 spec_helper 哪种方法有效。
例子:
RSpec.describe Foo do
let(:instance) { Foo.new }
SomeRailsModel = Object.new unless Kernel.const_defined?(:SomeRailsModel)
it 'calls quxo on SomeRailsModel' do
expect(SomeRailsModel).to receive(:quxo)
instance.bar
end
end
这段代码让我避免加载所有 Rails 并且执行得非常快。不幸的是,默认情况下(我喜欢这个)RSpec 将常量视为部分双精度并抱怨我的SomeRailsModel 常量不响应quxo 消息。验证双打很好,我想保留那个安全带。我可以通过将验证包装在 RSpec 定义的特殊块中来单独禁用验证。
最后,问题。在不需要所有 Rails 的情况下,在 PORO 上进行快速单元测试的推荐方法是什么?同时保持启用验证双打功能?有没有办法创建一个“苗条”rails_helper,它可以只加载app/models 和ActiveRecord 的最小子集以使验证工作?
【问题讨论】:
标签: ruby-on-rails ruby unit-testing rspec