Как настроить RSpec, Factory Bot и Spring для движка Rails 5
Много проектов на ДеньгиСмарт(один из моих прошлых работодателей) построены с использованием Рельсовые двигатели. Если вы новичок в концепции движков Rails, то в двух словах они представляют собой в основном миниатюрные приложения, которые продвигают модульность и возможность повторного использования (эти движки можно повторно использовать в нескольких приложениях Rails) кода. Для каждого из этих проектов мы решили написать наши тесты, используя RSpec вместе с Factory Bot для генерации наших тестовых данных. По мере того, как мы добавляем больше спецификаций к растущему движку, мы также добавили в смесь Spring, чтобы в целом у нас был более быстрый набор тестов.
Одна из причин этого поста заключается в том, что настройка Rails Engine со всем вышеперечисленным не была простой и требовала дополнительных поисков. Надеемся, что приведенные ниже шаги облегчат вам настройку RSpec, Factory Bot и Spring в новом движке Rails 5 в кратчайшие сроки:
Настройка RSpec
Шаг 1: Создайте новый движок, который пропускает тестовый блок и указывает, где должно быть создано фиктивное приложение для конкретного движка при использовании RSpec.
По умолчанию новый движок Rails поставляется с фреймворком тестового модуля. Итак, для начала вам нужно создать новый движок Rails с помощью команды
rails plugin new sample_engine --mountable --skip-test --dummy-path=spec/dummy
.Если вы внимательно посмотрите, вы можете задаться вопросом, как называется эта новая команда
--skip-test
? Многие из вас могут быть знакомы с--skip-test-unit
чтобы пропустить тестовый модуль в ваших приложениях Rails. Оказывается, с Rails 5, согласно Эта проблема теперь команда изменилась на--skip-test
.Вам также необходимо добавить
--dummy-path=spec/dummy
к команде, которая помогает создать новый движок Rails, поскольку эта опция указывает, где должно быть сгенерировано фиктивное приложение (которое будет использоваться для тестирования). Мы указываем использованиеspec
папку здесь, потому что мы используем RSpec в качестве нашей среды тестирования.С использованием
mountable
Опция сообщает генератору, что вам нужен движок с пространством имен. Вы можете узнать больше о том, почему можно было бы рассмотреть возможность использования монтируемого движка из того, что указано в руководствах по Rails. здесь.
Шаг 2: Добавьте rspec-rails
как зависимость развития
- Предполагая, что вы уже добавили Rails в файл gemspec вашего движка, теперь вам нужно добавить
rspec-rails
как зависимость разработки в том же файле. Вы можете сделать это с помощью командыs.add_development_dependency 'rspec-rails'
. Теперь вы можете запустить пакетную установку из корневого каталога вашего движка.
Шаг 3: Явно укажите использование RSpec в качестве тестовой среды
- Теперь из корневого каталога движка вам нужно перейти к
engine.rb
(расположен наlib/engine_name/engine.rb
) и явно заставить движок Rails использовать тестовую среду RSpec с помощью приведенной ниже команды. Если мы не укажем это изменение, все генераторы, которые используются для создания таких вещей, как модели и т. д., по отношению к движку фактически создадут соответствующие тесты с использованием Test Unit.
config.generators do |g|
g.test_framework :rspec
end
Шаг 4: Запустите команду генератора RSpec, чтобы получить основные установочные файлы RSpec.
- Затем вы можете запустить команду генератора RSpec (из корневого каталога вашего двигателя) —
rails g rspec:install
чтобы у вас были основные установочные файлы RSpec, необходимые для вашего движка.
Примечание: после того, как вы выполнили шаг 4, вы сможете запустить команду, например rails g model Widget name:string
и на самом деле увидеть файл спецификации, созданный для вас в соответствующем месте. Но вы пока не сможете запустить спецификацию.
Шаг 5: Получите RSpec для загрузки среды Rails фиктивного приложения
- По умолчанию RSpec будет искать файл среды (используемый для загрузки и инициализации приложения Rails) в обычном приложении Rails по пути, указанному в операторе:
require File.expand_path('../../config/environment', __FILE__)
как частьspec/rails_helper.rb
файл. Однако при использовании движка вам нужно будет указать путь к файлу среды относительно вашего фиктивного приложения, чтобы спецификации вашего движка работали. Для этого нам нужно заменить приведенную выше строку кода в вашемspec/rails_helper.rb
сrequire File.expand_path('../dummy/config/environment.rb', __FILE__)
. Еще одна вещь, которая подтверждает, что спецификации движка работают с фиктивным приложением, — это если вы видите миграцию, связанную с тестовой средой (при запускеRAILS_ENV=test rake db:migrate
относительно вашего двигателя), они добавляются вschema.rb
файл в фиктивном приложении.
Примечание: Вышеуказанные шаги присутствуют в этот пиар если вы хотите увидеть некоторые рабочие характеристики.
Настройка заводского бота
Шаг 1: Добавьте factory_bot_rails
как зависимость развития
- Для начала нужно добавить
s.add_development_dependency 'factory_bot_rails'
в файл gemspec вашего движка, а затем запустите установку пакета
Шаг 2. Включите автоматическое создание новых фабрик и укажите место их создания.
- Теперь вам нужно добавить приведенный ниже дополнительный код в ваш
engine.rb
так что всякий раз, когда вы пытаетесь создавать такие вещи, как новая модель и т. д., с помощью команды генератора Rails, у вас будут автоматически создаваться соответствующие фабрики в нужном месте в пределахspec/factories
каталог. Если вы не укажете путь, по которому вы хотите, чтобы новые фабрики были созданы для вас, через —g.factory_bot dir: 'spec/factories'
движок автоматически создаст для вас новые фабрики в локацииtest/factories/
.
module SampleEngine
class Engine < ::Rails::Engine
isolate_namespace SampleEngine
config.generators do |g|
g.test_framework :rspec
g.fixture_replacement :factory_bot
g.factory_bot dir: 'spec/factories'
end
end
end
Шаг 3: Требовать factory_bot_rails
чтобы сделать команду FactoryBot узнаваемой
- Дополнительно необходимо указать
require 'factory_bot_rails'
в твоейrails_helper.rb
иначе вы получитеuninitialized constant
связанная с этим ошибка при попытке использовать команду, напримерFactoryBot.create(:widget)
внутри любой из ваших спецификаций двигателя.
Шаг 4[Optional]: Разрешить доступ к фабрикам двигателей из проекта.
- Бывают случаи, когда вы хотите, чтобы ваши фабрики двигателей были доступны в проекте, в котором установлен двигатель, и для этого вам нужно добавить приведенный ниже код в свой
engine.rb
файл, как указано в Эта проблема наfactory_bot_rails
репо. Ваши фабрики будут созданы автономным движком без приведенного ниже кода и, таким образом, включают приведенный ниже код в вашengine.rb
является чисто необязательным.
module SampleEngine
class Engine < ::Rails::Engine
initializer "sample_engine.factories", after: "factory_bot.set_factory_paths" do
FactoryBot.definition_file_paths << File.expand_path('../../../spec/factories', __FILE__) if defined?(FactoryBot)
end
end
end
Шаг 5[Optional but Recommended]: Настройте свой набор тестов, чтобы включить методы factory_bot.
Можно избежать явного указания
FactoryBot.method_name
в своих спецификациях всякий раз, когда они хотят использовать метод Factory Bot, добавляя следующие изменения на основе раздел конфигурации который был связан как часть factory_bot_rails ПРОЧТИ МЕНЯ.- Нам нужно сначала добавить приведенный ниже код в файл с именем
factory_bot.rb
расположен внутриspec/support
RSpec.configure do |config| config.include FactoryBot::Syntax::Methods end
- Затем нам нужно добавить
require 'support/factory_bot'
в нашемrails_helper.rb
так как папка поддержки загружается неохотно
- Нам нужно сначала добавить приведенный ниже код в файл с именем
Примечание: Изменения, внесенные в рамках шагов 1–4, доступны в этот пиар и изменения шага 5 можно увидеть в этот пиар
Настройка весны
Шаг 1: Добавьте необходимые гемы в Gemfile
- Чтобы настроить spring с помощью RSpec, нам нужно сначала добавить весна а также весна-команды-rspec gems в gemfile движка. Эти драгоценные камни добавляются в Gemfile вместо того, чтобы указывать их в файле gemspec, поскольку они не являются ни зависимостью разработки, ни зависимостью времени выполнения для работы движка.
Шаг 2. Разрешите Spring узнать, где находится приложение движка
- Далее, поскольку мы используем Spring в контексте движка, нам нужно явно указать Spring, где находится наше приложение в контексте движка. Мы можем сделать это, указав приведенную ниже команду во вновь созданном файле с именем
spring.rb
в пределахengine_name/config
каталог. Приведенная ниже команда также была указана в официальном репозитории Spring. ПРОЧТИ МЕНЯ, но изначально было не очень понятно (по крайней мере мне), в какой именно файл нужно добавить этот код. Выяснив, куда именно этот код нужно добавить через эта проблема с гитхабомя представил PR как попытка сделать это более ясным как часть Пружины README.
Spring.application_root = './spec/dummy'
Шаг 3: Springify исполняемые файлы
- Теперь, когда мы сообщили Spring, где находится наше приложение, мы можем выполнить это, запустив
bundle exec spring binstub --all
ускорить выполнение исполняемых файлов в своемbin/
каталог. Теперь вы должны иметь возможность запускать команду, напримерspring rspec spec/models/sample_engine/widget_spec.rb
из корневого каталога вашего движка.
Примечание: Вышеуказанные шаги выполняются в этот пиар если вы хотите увидеть их более подробно с точки зрения кода.
Как прошел ваш опыт выполнения описанных выше шагов? Если у вас есть какие-либо отзывы или мысли, которыми можно поделиться в связи с этим постом, я с нетерпением жду вашего ответа в поле для комментариев ниже.