Есть и третий вариант: использование нескольких гемфайлов и нескольких фиктивных приложений.
Gemfiles
В Bundler есть полезная опция --gemfile
. С его помощью вы можете указать, какой файл использовать вместо Gemfile
, и он сгенерирует файл блокировки после того же имени:
bundle install --gemfile Gemfile.rails3
bundle install --gemfile Gemfile.rails4
Это создаст Gemfile.rails3.lock и Gemfile.rails4.lock. Итак, эти Gemfiles могут быть копией вашего основного Gemfile, форсирующего версию rails:
source "http://rubygems.org"
gemspec
gem "jquery-rails"
gem "rails", '~>4'
Использование gem-файлов из фиктивных приложений
Тогда у вас есть два фиктивных приложения, одно для 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.
person
kik
schedule
01.09.2013