测试葡萄以minitest返回未初始化的常数V1

时间:2015-10-28 09:48:13

标签: ruby-on-rails ruby ruby-on-rails-4 minitest grape

我目前使用葡萄定义了一个auth类,如下所示:

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

此类位于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
    ...

当我使用&#34; rake test test / api / v1 / api_auth_test.rb&#34;进行测试时测试运行正常。但是,如果我用&#34; rake test&#34;运行所有测试。或&#34; rake test test / api / v1 / *&#34;我收到以下错误:

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模块?

1 个答案:

答案 0 :(得分:1)

错误消息显示在Ruby加载测试文件时未定义V1。您必须加载(或require)您正在测试的相关应用代码,require必须先运行才能直接引用V1

是的,测试助手通常是一个很好的地方。如果您还没有测试帮助文件,则可能还需要require

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

module V1
end

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

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

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

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