我正在使用RSpec测试一些发动机型号.
我的偏好是在应用程序之外测试独立于(虚拟)应用程序的部分.我更喜欢在顶层进行非app测试,而不是隐藏在spec / dummy / spec中.
问题是默认情况下(AFAICT)如果未安装引擎,则不会运行引擎初始化程序.
我应该选择看起来预期的内容,即将所有规格放在虚拟应用程序中并从虚拟应用程序的目录运行RSpec,即使测试与整个应用程序无关?
或者我应该从非应用程序规范的顶级规范帮助程序运行初始化程序?或者其他一些方式?
如果我这样做,是否有虚假的应用程序影响?
最佳答案 如果你有一个虚拟应用程序,你不必在虚拟app目录结构中有你的规范.
以下是permitters v0.0.1使用的简化版本.
在spec / spec_helper.rb中:
ENV['RAILS_ENV'] = 'test'
app_path = File.expand_path("../dummy", __FILE__)
$LOAD_PATH.unshift(app_path) unless $LOAD_PATH.include?(app_path)
# if require rails, get uninitialized constant ActionView::Template::Handlers::ERB::ENCODING_FLAG (NameError)
require 'rails/all'
require 'config/environment'
require 'db/schema'
require 'rails/test_help'
require 'rspec/rails'
# rspec config, etc.
除此之外,我想说我在spec / dummy中的虚拟应用程序中所做的所有修改要么允许它在不同版本的Rails(3.1.x,3.2.x和4.0.x)中运行,要么因为我在虚拟应用程序中为gem配置了一些东西.
我目前也喜欢使用appraisal gem和TravisCI进行持续集成.我正在使用的设置允许我使用各种版本的gem测试各种版本的Rails,而不是大量的维护开销.它需要一点清理,但它运作良好.
如果你不想为某些规范加载Rails环境(即不为某些规范加载Rails,你肯定可以这样做.你可以在Rakefile或命令行中的任务定义中设置一个env var,然后在spec_helper.rb中查找是否要加载东西.然后你可以有各种Rake任务产生新的进程来设置env var或不依赖于一组测试是否需要Rails.我不一定担心这一点,但是如果一切都是为了在Rails中运行,除非你真的需要隔离它.
有关使用虚拟应用程序进行测试的不同方法的更多信息,您可能会看到以下问题:Strategies for gem tests to ensure the gem works with Rails 3.x and 4.0.