gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:54:30 26 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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 对 Controller 和模型的期望相同。文件名中的下划线变成驼峰式类/模块名称。一个名为 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 }

现在把你的库放在 extras/force_load 中它们应该在 Rails 启动时加载。

关于ruby-on-rails-3 - 为 lib 文件夹中的模块编写测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8503143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com