2011-07-05 64 views
4

關於引擎開發以及使用虛擬應用程序進行測試的內容很多。如何使用RSpec針對真實應用程序開發Rails3引擎?

在我們的例子中,我們正在開發一個不是獨立實體的引擎,但它依賴於真正的Rails 3應用程序。我們仍然希望此代碼位於引擎中,而不是應用程序的一部分,因爲引擎的工作是從具有自己的表和模型映射的遺留系統導入數據,並且我們希望最終再次刪除它。

舊遺留表與新架構之間的數據映射非常複雜,我們希望TDD(使用rspec)引擎。

  • 我已經關注Jose Valim's book "Crafting Rails Appliations",我正在使用enginex gem
  • 我用一個指向真實Rails 3應用的git子模塊替換了/spec/dummy_app
  • 我無法從引擎加載模型(未定義符號錯誤),因爲真正的應用程序的Gemfile沒有指向引擎,我也無法修改config/application.rb,要求引擎(這是什麼該虛擬應用程序的確如本書第15-16頁所述)。
  • 我將發動機的lib文件夾放入加載路徑$:spec_helper中,路徑可用。
  • require置入spec_helper.rb未解決問題。
  • 我想知道是否有一個內部的Rails API(或一個聰明的猴子補丁)掛鉤到真正的應用程序的啓動順序,並需要引擎,而不必修改真正的應用程序的代碼(因爲它在一個子模塊)。
  • 我不完全確定的另一個問題是我有2個Gemfiles(一個在引擎中,一個在應用程序中),並且當引擎處於活動狀態時,它們都應該被使用。

想法?

回答

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/engine需要在它自己的Gemfile中單獨依賴。

我找不到Bundler的任何API來向它傳遞兩個Gemfile,實際上Bundler似乎是圍繞一個權威Gemfile的假設而建立的。所以我在spec_helper中生成一個。我把這個應用程序的gemfile並附加gemspec,它指向GemSpec格式中的Gem依賴項。 (關於gemspec的提示從Jose Valim的書中不見了)。

我不知道在測試啓動期間是否有比連接文件更好的方法。如果您知道一個,請回復。

有用資源是:

相關問題