有很多关于引擎开发和使用虚拟应用程序进行测试的文章。
在我们的案例中,我们正在开发一个不是独立实体的引擎,但它依赖于真正的Rails 3应用程序。我们仍然希望此代码存在于引擎中,而不是成为应用程序的一部分,因为引擎的工作是从具有自己的表和模型映射的遗留系统导入数据,并且我们希望最终再次删除它。 / p>
旧的遗留表和新模式之间的数据映射很复杂,我们想要TDD(使用rspec)引擎。
/spec/dummy_app
。config/application.rb
,需要引擎(正如虚拟应用程序所做的那样,正如本书第15-16页所述)。lib
文件夹包含在$:
的加载路径spec_helper
中,路径可用。require
放入spec_helper.rb
并没有解决问题。思想?
答案 0 :(得分:8)
所以,我想出了一些事情并且会回答我自己的问题,现在我已经开始工作了。
为简单起见,我将把我宝石的名称称为“my_gem”和“MyGem”:
在engine.rb
文件中,我添加了:
require 'my_gem'
require 'rails'
这种类型的固定错误:
my_gem/lib/my_gem/engine.rb:2: uninitialized constant MyGem::Rails (NameError)
在spec_helper.rb
中,我直接添加了:
require 'bundler/setup'
require 'my_gem'
这是为了确保Bundler立即初始化,而不是通过应用程序。这样我可以在这里加载MyGem,它将被挂钩到应用程序的初始化序列中。这修复了引擎模型类的NameError
个异常。
这留下了Gemfile
使用的问题。问题是我的应用程序有自己的gemfile,而gem /引擎需要在其自己的Gemfile
中单独的依赖项。
我找不到Bundler的任何API来传递两个Gemfile
,实际上Bundler似乎是围绕一个权威Gemfile
的假设而构建的。所以我在spec_helper
中生成一个。我使用应用程序的gemfile并附加gemspec
,它指向gem的GemSpec格式的依赖项。 (顺便说一句,Jose Valim的书中没有提到关于gemspec
的提示。)
我不知道在测试启动期间是否有比连接文件更好的方法。如果您知道其中一个,请回复。
有用的资源是: