Ruby on rails 一个引擎的*所有*规格是否都会出现在虚拟Rails应用程序中?

Ruby on rails 一个引擎的*所有*规格是否都会出现在虚拟Rails应用程序中?,ruby-on-rails,ruby,rspec,factory-bot,rails-engines,Ruby On Rails,Ruby,Rspec,Factory Bot,Rails Engines,我正在使用RSpec测试一些发动机模型 我的偏好是在应用程序之外测试独立于(虚拟)应用程序的部分。我更希望非应用程序测试在顶层进行,而不是隐藏在spec/dummy/spec中 问题在于,默认情况下(AFAICT),如果未安装引擎,则不会运行引擎初始值设定项 我是否应该按照预期进行,即将所有规格放入虚拟应用程序,并从虚拟应用程序的目录运行RSpec,即使测试与整个应用程序无关 或者我应该从非应用程序规范的顶级规范帮助程序运行初始值设定项吗?还是其他方式 如果我这样做了,是否会对虚拟应用程序产生影

我正在使用RSpec测试一些发动机模型

我的偏好是在应用程序之外测试独立于(虚拟)应用程序的部分。我更希望非应用程序测试在顶层进行,而不是隐藏在
spec/dummy/spec

问题在于,默认情况下(AFAICT),如果未安装引擎,则不会运行引擎初始值设定项

我是否应该按照预期进行,即将所有规格放入虚拟应用程序,并从虚拟应用程序的目录运行RSpec,即使测试与整个应用程序无关

或者我应该从非应用程序规范的顶级规范帮助程序运行初始值设定项吗?还是其他方式


如果我这样做了,是否会对虚拟应用程序产生影响?

如果您有虚拟应用程序,则不必在虚拟应用程序目录结构中包含您的规格

以下是v0.0.1使用的简化版本

spec/spec\u 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
中对dummy应用程序所做的所有修改要么是为了允许它在不同版本的Rails(3.1.x、3.2.x和4.0.x)中运行,要么是因为我在dummy应用程序中为gem配置了一些东西

我目前也喜欢使用gem和TravisCI进行持续集成。我使用的设置允许我使用不同版本的gems在不同版本的Rails中进行测试,而不需要太多的维护开销。它需要一点清理,但效果很好

如果您不想加载特定规格集的Rails环境(也就是说,不为某些规范加载Rails,您完全可以这样做。您可以在Rakefile或命令行的任务定义中设置一个环境变量,然后在spec_helper.rb中查找该变量,以确定是否加载。然后,您可以拥有各种Rake任务,这些任务生成新的进程,这些进程设置环境变量与否取决于有一组测试需要Rails,但如果所有测试都要在Rails中运行,我不必担心这一点,除非您真的需要隔离它


有关使用虚拟应用进行测试的不同方法的更多信息,您可能会看到以下问题:。

@apreading谢谢:)初始化器呢?或者我应该把它们移到
lib
中的某个地方,或者…?你这里的或多或少就是我现在的delta初始化器。好吧,我明白了,如果初始化器设置了必要的上下文,你可以在某些规范中要求它们。这还不够吗?@apheading可能,尽管有些是acr使用的猴子补丁oss规范。我的规范助手可能有问题,修复它可以让我在不同的环境中运行两套规范,并使用适当的初始值设定项,但我还没有弄明白其中的含义。这不是“需要”隔离它的问题,而是(1)一个比子目录中更明显的位置,以及(2)如果规范不依赖于Rails,那么它们似乎应该能够生活在引擎的顶层,而不是隐藏在虚拟应用程序中。这更像是一个哲学问题,而不是技术问题,有一些技术分支。我将查看您的链接;谢谢。我同意。我喜欢将规范放在虚拟应用程序之外的原因是(1)我希望能够将虚拟应用程序视为Rails环境,而不是我的GEM或我的测试,(2)如果出于任何原因,我想对不同的虚拟应用程序运行相同的规格集(虽然这是更干净的,如果您只使用虚拟应用程序中的条件),我可以很容易地,和(3)正如您所说的,将测试放在spec目录而不是spec/dummy/spec目录中更为明显。尝试稍微改写我的答案,并提供一些实际代码,而不仅仅是一个链接。