gpt4 book ai didi

ruby-on-rails-3 - 如何使用 RSpec 针对真实应用开发 Rails3 引擎?

转载 作者:行者123 更新时间:2023-12-04 23:29:58 27 4
gpt4 key购买 nike

已经写了很多关于引擎开发和使用虚拟应用程序进行测试的文章。

在我们的例子中,我们正在开发一个引擎,它不是一个独立的实体,而是依赖于一个真实的 Rails 3 应用程序。我们仍然希望这段代码存在于引擎中,而不是成为应用程序的一部分,因为引擎的工作是从具有自己的表和模型映射的遗留系统中导入数据,我们希望最终再次将其删除。

旧遗留表和新模式之间的数据映射很复杂,我们希望对引擎进行 TDD(使用 rspec)。

  • 我关注了Jose Valim's book "Crafting Rails Appliations"并且正在使用 enginex gem .
  • 我已替换 /spec/dummy_app带有指向真实 Rails 3 应用程序的 git 子模块。
  • 我无法从引擎加载模型( undefined symbol 错误),因为真正的应用程序的 Gemfile 没有指向引擎,而且我也无法修改 config/application.rb , 需要引擎(这是虚拟应用程序所做的,如本书第 15-16 页所述)。
  • 我包括引擎的lib文件夹到加载路径$:spec_helper并且路径可用。
  • require进入 spec_helper.rb没有解决问题。
  • 我想知道是否有一个内部 Rails API(或一个聪明的猴子补丁)来 Hook 真实应用程序的启动序列并需要引擎,而无需修改真实应用程序的代码(因为它在子模块中)。
  • 我不完全确定的另一个问题是我有 2 个 Gemfile(一个在引擎中,一个在应用程序中),当引擎处于事件状态时,它们都应该被使用。

  • 想法?

    最佳答案

    所以,我想出了一些事情,并会回答我自己的问题,现在我已经开始工作了。

    为简单起见,我将我的 gem 的名称称为“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引擎模型类的异常(exception)。

    剩下的问题是 Gemfile使用。问题是我的应用程序有自己的 gemfile,而 gem/engine 需要它自己的独立依赖项 Gemfile .

    我找不到任何用于 Bundler 的 API 来传递两个 Gemfile对它来说,实际上 Bundler 似乎是建立在单一权威 Gemfile 的假设之上的。 .所以我在 spec_helper 中生成一个.我获取应用程序的 gemfile 并附加 gemspec它以 GemSpec 格式指向 gem 的依赖关系。 (顺便说一下,Jose Valim 的书中缺少关于 gemspec 的提示)。

    我不知道是否有比在测试启动期间连接文件更好的方法。如果你知道一个,请回复。

    有用的资源是:
  • Clarifying the Roles of the .gemspec and Gemfile通过耶胡达·卡茨
  • Bundler Documentation for gemspec
  • 关于ruby-on-rails-3 - 如何使用 RSpec 针对真实应用开发 Rails3 引擎?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6587413/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com