Я пытаюсь выполнить модульное тестирование простого старого объекта Ruby, у которого есть метод, вызывающий метод класса в модели Rails.Приложение 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.
Наконец, вопрос.Каков рекомендуемый способ проведения быстрых модульных тестов на PORO, которые используют модели Rails, не требуя наличия всех Rails, и в то же время сохраняя включенную функцию проверки двойников?Есть ли способ создать «тонкий» rails_helper
, который может просто загрузить app/models
и минимальное подмножество ActiveRecord
, чтобы проверка работала?