Ruby on rails 3 为lib文件夹中的模块编写测试
我想为我创建的模块文件编写单元测试,并将其放在lib目录中。在test/unit目录下,我创建了一个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
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预期的方式命名
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)自动加载