我想为我创建的模块文件编写单元测试并将其放在lib目录中。在test / unit目录下,我创建了一个mylib_test.rb
文件。在文件中我需要mylib。当我运行rake test:units
时,会出现const_missing: uninitialized constant mylib::constantname
错误。我认为这是因为它没有加载rails环境,因为常量是在一个初始化文件中定义的。我是对的?我如何让它工作?为模块编写单元测试的最佳方法是什么?
我正在使用rails 3.1.3,当我从终端和浏览器运行应用程序时,该模型运行良好。
答案 0 :(得分: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 2.3.5: How does one access code inside of lib/directory/file.rb?)
按照惯例,Rails希望模块的名称与目录层次结构和文件名匹配。因此,文件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
)。
注意 autoload 并不意味着模块在启动时自动加载;相反,它在第一次使用时会自动加载。因此,即使您的puts "hi from mylib"
文件顶部有mylib.rb
之类的代码,在您的代码在某处使用Mylib
之前,您也不会看到该打印。
最后,如果你真的希望你的模块在启动时加载 ,请创建一个名为config/initializers/force_load_libraries.rb
的文件并将其放在那里:
Dir.glob("#{Rails.root}/extras/force_load/*.rb").each { |f| require f }
现在把你的lib放在extras/force_load
中,它们应该在Rails启动时加载。
答案 1 :(得分:0)
我终于意识到出了什么问题。在我的测试文件中,我在lib
目录中包含了我的模块,而不是重新打开模块并将测试文件放在模块中。做完rake测试后:单位完美运作。测试文件应保留在test/unit
目录