2011-12-14 52 views
4

我想爲我創建的模塊文件編寫單元測試並將其放在lib目錄中。在test/unit目錄下,我創建了一個mylib_test.rb文件。在文件中我需要mylib。當我運行rake test:units時,出現const_missing: uninitialized constant mylib::constantname錯誤。我在想,這是因爲它沒有加載rails環境,因爲常量是在一個初始化文件中定義的。我是對的嗎?我如何使它起作用?爲模塊編寫單元測試的最佳方法是什麼?爲lib文件夾中的模塊寫入測試

我正在使用rails 3.1.3,當我從終端和瀏覽器運行應用程序時,模型完美工作。

+0

+1。我想知道更多關於如何在Rails 3.1中測試自定義模塊 – brutuscat

+0

我做了rake環境測試:單元,但它仍然無法工作。我認爲這應該是加載環境,但它仍然沒有工作 – serengeti12

+0

我做了什麼(使用RSpec2而不是Test:Unit),讓我的模塊抓取到extras /文件夾中,如下所示:extras/crawl/module.rb是在我的spec文件夾中添加重複的這些路徑,如spec/extras/crawl/module_spec.rb。然後我還創建了一個初始化程序,它需要像「crawl/string」這樣的自定義設置。認爲我的自定義類是自動加載在我的application.rb config.autoload_paths + =%W(#{config.root}/extras) – brutuscat

回答

0

我終於意識到出了什麼問題。在我的測試文件中,我包含了lib目錄中的模塊,而不是重新打開模塊並將測試文件放入模塊中。做完這個耙測試之後:單位完美地工作。測試文件應保留在test/unit目錄中

0

我剛剛遇到了這個。有(至少?)2可能出現的問題:

  • 你的模塊沒有在自動加載路徑

查找範圍config/application.rb這條線:

config.autoload_paths += %W(#{config.root}/extras) 

如果它的評論,取消註釋。該行將打開extras中的所有文件以及extras的子目錄中的所有文件的自動加載。這可能是最安全的移動你的模塊插入extras,但如果你真的要離開他們lib,更改行是:

config.autoload_paths += %W(#{config.root}/extras #{config.root}/lib) 
  • 你的模塊是自動加載路徑,但不能命名方式Rails的預計

(看到這一點:Rails 2.3.5: How does one access code inside of lib/directory/file.rb?

按照慣例,Rails的希望你的模塊的名稱的目錄^ h匹配層次結構和文件名。因此,該文件extras/mylib.rb預計將包含

module Mylib # not MyLib or My_lib 
    ... 
end 

這適用於子目錄爲好,這樣一個文件extras/mydir/mylib.rb應包含:

module Mydir 
    module Mylib # or class Mylib 
    ... 
    end 
end 

這個命名約定一致,那麼Rails的預計,控制器和楷模。文件名中的下劃線變成camelcase類/模塊名稱。一個名爲my_lib.rb的文件預計會有一個module MyLib(但不包括Mylib)。

注意自動加載並不意味着模塊在啓動時自動加載;相反,它在第一次使用時會自動加載。因此,即使您在mylib.rb文件的頂部有puts "hi from mylib"之類的代碼,在代碼使用Mylib之前,您也不會看到該打印。

最後,如果你真的想你的模塊在啓動時加載,去創建一個名爲config/initializers/force_load_libraries.rb文件,並把這個在那裏:

Dir.glob("#{Rails.root}/extras/force_load/*.rb").each { |f| require f } 

現在去把你的庫中extras/force_load,他們應該在負載Rails啓動。

+0

Dave我正在做所有這一切,它沒有工作 – serengeti12