用 minitest 测试葡萄 returns 未初始化的常量 V1

testing grape returns uninitialized constant V1 with minitest

我目前使用 grape 定义了一个身份验证 class,如下所示:

module V1
  class ApiAuth < Grape::API
    resource :auth do
      desc "Creates and returns access_token if valid login"
        post ...

此 class 位于 app/api/v1 目录中。我的测试如下所示:

class V1::ApiAuthTest < ActiveSupport::TestCase
  include Rack::Test::Methods

  def app
    Rails.application
  end

  def setup
    @candidate = create(:candidate_with_encrypted_password)
  end

  test 'returns status 201 when logged in' do
    ...

当我 运行 测试和 "rake test test/api/v1/api_auth_test.rb" 测试 运行 没问题。但是,如果我 运行 所有使用 "rake test" 或 "rake test test/api/v1/*" 的测试,我都会收到以下错误:

rake aborted!
NameError: uninitialized constant V1
/Users/user/Projects/learning/test/api/v1/api_auth_test.rb:1:in `<top (required)>'
Tasks: TOP => test:run
(See full trace by running task with --trace)

我做错了什么,我必须在 test_helper 中加载 V1 模块吗?

错误信息显示V1没有在Ruby加载测试文件的地方定义。您必须加载(或 require)您正在测试的相关应用程序代码,并且 require 必须 运行 才能直接引用 V1

是的,测试助手通常是执行此操作的好地方。如果您还没有,您可能还需要 require 来自测试的测试帮助程序文件。

如果您已经需要应用程序代码以便稍后对其进行测试,那么这可以被视为命名空间尚不存在的更简单的问题。要么在助手中定义它:

module V1
end

或者从问题中更改测试代码以完全嵌套命名空间:

module V1
  class ApiAuthTest < ActiveSupport::TestCase
  # Etc.

采用哪种方法取决于您希望如何组织依赖项。如果加载时 运行s 的测试文件中的任何其他内容取决于其他地方的定义(例如,必须定义 Rack::Test::Methods 才能 include 它),那么它需要在测试文件引用它之前加载

您通常不需要担心 test 块中定义的内容,直到它们是 运行,因此您通常可以按顺序加载测试代码和应用程​​序代码,一切都会好起来的。在这种情况下,可能只是缺少命名空间导致您需要注意文件的加载顺序。