【问题标题】:writing tests for modules in lib folder为 lib 文件夹中的模块编写测试
【发布时间】:2011-12-14 10:44:31
【问题描述】:

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

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

【问题讨论】:

  • 为此 +1。我也想了解更多关于如何在 Rails 3.1 中测试自定义模块
  • 我做了 rake environment test:units,但还是不行。我以为这应该加载环境,但它仍然没有工作
  • 我做了什么(使用 RSpec2 而不是 Test:Unit),让我的模块在 extras/ 文件夹中爬行,如下所示:extras/crawl/module.rb 是在我的规范文件夹中添加重复的这些路径,就像这个spec/extras/crawl/module_spec.rb。然后我还创建了一个初始化器,它需要像'crawl/string'这样的自定义。以为我的自定义类是在我的 application.rb config.autoload_paths += %W(#{config.root}/extras)

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


【解决方案1】:

我也遇到了这个问题。有(至少?)两个可能的问题:

  • 您的模块不在自动加载路径中

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 对控制器和模型的期望相同。文件名中的下划线变成驼峰式类/模块名。一个名为my_lib.rb 的文件应该有一个module MyLib(但不是Mylib)。

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

【讨论】:

    【解决方案2】:

    我终于意识到出了什么问题。在我的测试文件中,我包含了来自lib 目录的模块,而不是重新打开模块并将测试文件放入模块中。做完那个 rake test:units 工作得很好。测试文件应保留在test/unit 目录中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 2012-01-18
      相关资源
      最近更新 更多