在lib文件夹中编写模块测试

时间:2011-12-14 10:44:32

标签: ruby-on-rails-3 unit-testing testing

我想为我创建的模块文件编写单元测试并将其放在lib目录中。在test / unit目录下,我创建了一个mylib_test.rb文件。在文件中我需要mylib。当我运行rake test:units时,会出现const_missing: uninitialized constant mylib::constantname错误。我认为这是因为它没有加载rails环境,因为常量是在一个初始化文件中定义的。我是对的?我如何让它工作?为模块编写单元测试的最佳方法是什么?

我正在使用rails 3.1.3,当我从终端和浏览器运行应用程序时,该模型运行良好。

2 个答案:

答案 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预期的方式命名

(见: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目录