Вопрос по testing, gem, ruby-on-rails-3, ruby-on-rails-4, ruby-on-rails – Стратегии для тестирования драгоценных камней, чтобы убедиться, что гем работает с Rails 3.x и 4.0?

10

Мы видели несколько примеров фиктивных приложений Rails (для тестирования, так что они, как правило, живут под тестовыми или техническими каталогами) для использования с гемом Appraisals, которые предположительно работают с Rails 3.x и Rails 4, но они кажутся хакерскими и не полностью функциональны. Это несколько ожидаемо, так как это урезанный монстр Франкенштейн, который пытается быть совместимым с различными версиями Rails 3, а также Rails 4.I '

мы упомянули проекты, которые пытаются выполнить такого рода тестирование (по состоянию на конец марта 2013 года), например, less-rails и ember-rails, но этот способ тестирования с различными версиями Rails не делает 'Это кажется очень чистым, и нетрудно попытаться отладить нестандартное приложение Rails, особенно в бета-версии Rails.

Было бы здорово иметь более чистый способ тестирования, который позволит вам иметь полное Rails-приложение для каждой версии Rails, чтобы тестировать его с помощью какой-то магии не так сложно в настройке или обслуживании, и нене требуются нестандартные пути хаков в местах и т. д.

Каковы доступные стратегии тестирования гемов с различными версиями Rails (включая, по крайней мере, последние версии Rails 3.1.x, 3.2.x и 4.0.0.beta1), и каковы плюсы и минусы каждого из них?

Ваш Ответ

2   ответа
3

связанная тема в списке основных рельсов:

Вариант 1: оценочный гем и одиночное Rails-приложение

Кен Коллинз упомянул об использовании оценки и Rails "манекен» приложение:

Я тестирую minitest-spec-rails против 3.0, 3.1, 3,2 и 4.0, используя комбинацию оценки и dummy_app, которая минимально настраивает себя в зависимости от версии rails, с которой он тестирует. Некоторые ссылки:

https://github.com/metaskills/minitest-spec-rails https://github.com/metaskills/minitest-spec-rails/blob/master/test/dummy_app/init.rb

Подобные методы используются вменее рельсы,Эмбер рельсы, а такжевысокое напряжение среди других.

Я использовал аналогичную настройку длявысокое напряжение вrestful_json (v3.3.0), но с полным приложением Rails, созданным с 4.0.0-бета1, которое я изменил минимально, чтобы также работать с Rails 3.1.x / 3.2.x.

Обновить: Может хотеть увидетьpermitters для более свежего примера.

Плюсы: довольно просто. Может тестировать на различные версии Rails из командной строки и т. Д. Может быть очень минимальной конфигурацией приложения Rails или может использовать полное приложение Rails с небольшими отличиями.

Минусы: по-прежнему используется одно и то же приложение Rails для нескольких версий Rails, поэтому некоторые условия и ненужные настройки. (Возможные проблемы с некоторыми файлами, которые не применимы в другой версии Rails и т. Д., Но не являются большой проблемой.)

Вариант 2: версия Rails как переменная среды с одним Gemfile, одним фиктивным приложением Rails, использующим travis-ci для тестирования в нескольких версиях

Стив Клабник упомянул решение, которое работает с одним Gemfile, одним полным Rails-приложением (хотя и в разделе "манекен» dir, и не использовать драгоценный камень оценки, полагаясь на travis-ci, чтобы проверить:

хотел обсудить эту тему больше, так как яв последнее время я делаю это для моих драгоценных камней. У меня есть два, которые делают это:

Draper:https://github.com/drapergem/draper

LocaleSetter:https://github.com/jcasimir/locale_setter/

По сути, я встраиваю в гем целое приложение Rails, а затем запускаю его для нескольких версий Rails на travis через env vars.

Плюсы: просто. Нет зависимости от оценочной жемчужины (не то, чтобы это была проблема, но ее легче поддерживать).

Минусы: все еще повторное использование одного и того же приложения Rails для нескольких версий Rails из того, что я могу сказать. Если только не использовать travis-ci или что-то, что начинается с чистого набора гемов (то есть, если он запускается из командной строки), в настоящее время не дифференцировать наборы гемов, так что более новый гем можно использовать со старыми Rails и т. Д., Но Стив сказал, что если это вызовет проблему Вы можете просто взорвать замок и снова связать.

2

Третий вариант: использование нескольких gem-файлов и нескольких фиктивных приложений.

Gemfiles

Bundler имеет полезную опцию с именем--gemfile, С его помощью вы можете указать, какой файл использовать вместоGemfile, и он сгенерирует файл блокировки с тем же именем:

bundle install --gemfile Gemfile.rails3
bundle install --gemfile Gemfile.rails4

Это сгенерирует Gemfile.rails3.lock и Gemfile.rails4.lock. Итак, эти Gemfiles могут быть копией вашей основной версии форсирующих рельсов Gemfile:

source "http://rubygems.org"
gemspec
gem "jquery-rails"
gem "rails", '~>4' 
Использование гемфайлов из фиктивных приложений

Тогда у вас есть два фиктивных приложения, одно для rails-3 и одно для rails-4. Чтобы использовать их правильный gemfile при выполнении (например) миграций:

cd test/dummy_rails3
BUNDLE_GEMFILE=../../Gemfile.rails3 bundle exec rake db:migrate
cd ../dummy_rails4
BUNDLE_GEMFILE=../../Gemfile.rails4 bundle exec rake db:migrate

Да, этоВероятно, худшая часть. Но это в основном однократная установка.

Использование гемфайлов из граблей

Чтобы указать, какую версию использовать при запуске тестов, установите переменную среды BUNDLE_GEMFILE в Rakefile:

#!/usr/bin/env rake

rails_version = ENV[ 'RAILS_VERSION' ] || '4'

if rails_version == '3'
  ENV[ 'BUNDLE_GEMFILE' ] = 'Gemfile.rails3'
else
  ENV[ 'BUNDLE_GEMFILE' ] = 'Gemfile.rails4'
end

begin
  require 'bundler/setup'
rescue LoadError
  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
end

Я предпочитаю попросить пользователя передать RAILS_VERSION вместо BUNDLE_GEMFILE, потому что этолегче запомнить, и мы можем просто пропустить "3" или "4".

Использование правильного фиктивного приложения из тестов

Наконец, в test_helper, переключите фиктивное приложение в зависимости от того, какая версия rails запрашивалась:

# Configure Rails Environment
ENV["RAILS_ENV"] = "test"

dummy_app = ENV[ 'RAILS_VERSION' ] == '3' ? 'dummy_rails3' : 'dummy_rails4'

require File.expand_path("../#{dummy_app}/config/environment.rb",  __FILE__)
require "rails/test_help"
С вашей точки зрения пользователя

Чтобы ваш пользователь мог запускать тесты, он должен будет выполнить однократную настройку, запустив задачи миграции с помощью BUNDLE_GEMFILE, что не так уж и сексуально.

Но после этого пользователь может запускать тесты для rails-3 и rails-4 без необходимости генерировать Gemfile каждый раз, когда он хочет переключить версию, и вы можете иметь специфический для версии код и конфигурацию в своих тестовых приложениях без необходимости помещатьif Rails.version >= '4' заявления везде.

Чтобы запустить спецификации:

RAILS_VERSION=3 bundle exec rake test
bundle exec rake test # rails-4 is the default in code I wrote

Вы можете увидеть пример для этого метода в моемactiverecord_any_of gem.

Похожие вопросы