Как настроить 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 из корневого каталога вашего движка.

Примечание: Вышеуказанные шаги выполняются в этот пиар если вы хотите увидеть их более подробно с точки зрения кода.

Как прошел ваш опыт выполнения описанных выше шагов? Если у вас есть какие-либо отзывы или мысли, которыми можно поделиться в связи с этим постом, я с нетерпением жду вашего ответа в поле для комментариев ниже.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *