Ruby on rails 3 为lib文件夹中的模块编写测试

Ruby on rails 3 为lib文件夹中的模块编写测试,ruby-on-rails-3,unit-testing,testing,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

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


我使用的是rails 3.1.3,当我从终端和浏览器运行应用程序时,该模型工作得非常好。

我也遇到了这个问题。可能存在(至少?)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希望模块的名称与目录层次结构和文件名匹配。因此文件
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
的文件中应该有
模块MyLib
(但不是
MyLib

注意自动加载并不意味着模块在启动时自动加载;相反,它在第一次使用时会自动加载。因此,即使您有一些代码,如
将“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启动时加载。

我终于意识到出了什么问题。在我的测试文件中,我包含了
lib
目录中的模块,而不是重新打开模块并将测试文件放入模块中。在完成耙测试之后:单元工作得非常好。为此,测试文件应保留在
Test/unit
目录中。我也想知道更多关于如何在Rails3.1I中测试自定义模块的信息,我做了rake环境测试:units,但它仍然不起作用。我原以为应该加载环境,但它仍然不起作用(使用usgin RSpec2而不是Test:Unit),让我的模块在extras/文件夹中爬行,如:extras/crawl/module.rb就是在我的spec文件夹中添加重复的路径,如spec/extras/crawl/module_spec.rb。然后我还创建了一个初始值设定项,它需要像“crawl/string”这样的自定义设置。我的自定义类在我的application.rb config.autoload_路径+=%W(#{config.root}/extras)自动加载