Ruby on Rails:加载用于单元测试的实用模块

问题描述 投票:0回答:1

我在

Datetools
中有一个模块
lib/utils/datetools.rb
:

module Datetools
  def hello
    'world'
  end
end

我想用

DatetoolsTest
中名为
test/utils/datetools_test.rb
的类来测试它:

import Datetools

class DatetoolsTest < TestCase
  test 'hello world' do
    assert Datetools.hello() == 'world'
  end
end

当我跑步时:

rails t test/utils/datetools_test.rb

我收到错误:

uninitialized constant Datetools (NameError)

如何在测试用例中获取我的

Datetools
模块?

版本:Ruby 3.3.5、Rails 7.1.4

ruby-on-rails ruby import module
1个回答
0
投票

你在这里看起来很困惑。

lib
不在自动加载路径上,因此如果您需要执行以下操作之一:

  • 使用
    require Rails.root.join('lib/utils/datetools')
  • 手动要求代码
  • 使用 config.autoload_lib 启用 lib 目录的自动加载。这是 Rails 7 中的新功能。在以前的版本中,您需要手动将目录添加到自动加载路径。
  • 将代码放入
    app/utils
    而不是 lib 中,因为它及其所有子文件夹都是自动加载根目录。

但是,即使您加载代码,您仍然会得到

undefined method 'hello' for module Datetools (NoMethodError)
。如果您希望该方法可作为模块方法调用,则需要使用
def self.hello
module_function
方法。

也不清楚你为什么打电话

import Datetools
。它的作用是将 Datetools 的实例方法复制到recipent中,此时是
main
(Ruby全局对象)。

如果您真正想要做的是测试模块的实例方法,那么更好的方法是在测试中创建一个类中的立场:

class DatetoolsTest < TestCase
  # You could also use Class.new to create an anonymous class instead
  class DummyClass
    import Datetools
  end

  test 'hello world' do
    assert_equal DummyClass.new.hello, 'world'
  end
end

或者将模块导入到测试类中:

class DatetoolsTest < TestCase
  import Datetools

  test 'hello world' do
    assert_equal hello, 'world'
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.