我见过假Rails应用的几个例子(用于测试,让他们生活在测试或符合规范迪尔斯,通常情况下),用于与估价的宝石,据说使用Rails 3.x和轨道4,5两个工作中使用,但他们似乎并的hackish没有充分发挥作用。 这在一定程度上预计,因为它是试图将使用Rails 3和轨道4的各种版本兼容的精简弗兰肯斯坦的怪物。
我已经提到了试图做这样的测试(如2013年3月下旬),如不太轨和烬护栏的项目,但这种方式与各种版本的Rails的测试似乎不是很干净,而且它是不平凡的尝试调试一个非标准的Rails应用程序,特别是Rails中的测试版。
这将是巨大的,有一个更清洁的方式来测试,让您拥有的Rails每个版本的完整的Rails应用程序通过一些魔法与测试并不难设置或维护,不需要非标准路径黑客在地方,等等。
什么是用于测试使用Rails的各种版本的宝石可用的策略(至少包括最新的Rails 3.1.X,3.2.x中,和4.0.0.beta1),并且各有什么利弊?
从一些选项相关的线程轨道核清单:
选项1:鉴定宝石和单Rails的虚拟应用程序
肯·柯林斯利用评价和Rails的“虚拟”的应用程序中提到:
我测试MINITEST规格的护栏对3.0,3.1,3.2和4.0使用评估和dummy_app的混合是最低限度地配置自身根据其轨道版本,它是针对测试。 一些链接:
https://github.com/metaskills/minitest-spec-rails https://github.com/metaskills/minitest-spec-rails/blob/master/test/dummy_app/init.rb
类似的技术在使用较少的护栏 , 烬护栏 ,并high_voltage等等。
我用了一个类似的设置,以high_voltage在restful_json (3.3.0),但与4.0.0-β1,我修改最低限度也使用Rails 3.1.X / 3.2.x中工作创建一个完整的Rails应用程序。
更新 :可能希望看到permitters的更近的例子。
优点:非常简单。 可以测试免受命令行等各种Rails的版本可以在非常小的Rails应用程序的配置,也可以使用完整的Rails应用程序有细微的差别。
缺点:还是重用了多个Rails版本相同的Rails应用程序,所以一些条件语句和不必要的配置。 (有一些文件不导轨等的另一个版本是适用的,但似乎并没有成为一个大问题,可能出现的问题。)
选项2:Rails的版本与单个的Gemfile环境变量,单个的Rails虚设应用,依靠特拉维斯-Cl在多个版本,以测试
史蒂夫Klabnik提到,单一的Gemfile,一个完整的Rails应用程序(即使在“虚拟”目录,并没有使用鉴定宝石的有效的解决方案,依靠特拉维斯-CI测试:
我一直到更多的讨论这个话题,因为我已经做了一堆我的宝石最近。 我有两个是这样做:
德雷珀: https://github.com/drapergem/draper
LocaleSetter: https://github.com/jcasimir/locale_setter/
基本上,我嵌入整个Rails应用程序进入宝石,然后在特拉维斯运行它针对的Rails的多个版本通过ENV瓦尔。
优点:简单。 在宝石鉴定不依赖(不,这是一个问题,但可能会更容易维护)。
缺点:还是重用从我可以告诉多个Rails版本相同的Rails应用程序。 除非使用特拉维斯-CI或东西,用干净的宝石开始(即,如果在命令行中运行),不区分目前这样gemsets新的宝石可以与旧导轨等使用,但史蒂夫说,如果这是导致问题,你可以只吹走锁和重新捆绑。
还有第三个选项:使用多gemfiles和多个虚拟应用程序。
Gemfiles
捆绑有一个名为一个有用的选项--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'
从虚拟应用程序使用gemfiles
然后你有两个虚拟应用程序,一个用于轨道-3和一个用于轨道-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
是啊,这可能是最糟糕的部分。 但是,这主要是一次性的设置。
从耙使用gemfiles
指示同时运行测试,在Rake文件设置环境变量BUNDLE_GEMFILE使用的版本:
#!/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,切换虚拟应用取决于什么轨版本已经要求:
# 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,这是不是性感的迁移任务做了一个时间设置。
但是,一旦完成后,用户可以运行针对测试轨道-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宝石 。