2011-12-14 125 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