«NoMethodError: неопределенный метод env для nil: NilClass» для тестирования помощников в рельсах - PullRequest
0 голосов
/ 30 января 2020

Я пытался зайти в Google, но нигде не нашел информации об этой ошибке для ActionView. Я использую Minitest (без Rspe c)

custom_user_groups_helper_test.rb

class CustomUserGroupsHelperTest < ActionView::TestCase
    test "should work custom user" do
      response_params  = gotta_get
   end
end

custom_user_groups_helper.rb

 module CustomUserGroupsHelper

  def self.gotta_get
    return true
  end

Этот test_helper.rb прекрасно работает с тестом контроллера, но когда я использую его для вспомогательного теста, он выдает мне эту ошибку

Error:
CustomUserGroupsHelperTest#test_should_work_custom_user:
NoMethodError: undefined method `env' for nil:NilClass

Я тоже попробовал другое решение

«неопределенный метод env для nil: NilClass» в ошибке «setup_controller_for_warden» при тестировании Devise с использованием Rspe c

Но, похоже, это для контроллера, ни одно из решений не предназначено для вспомогательного тестирования. Что до include для ActionView::TestCase от Devise

Я пытался включить эти

include Devise::TestHelpers
include Devise::Test::IntegrationHelpers
include Devise::Test::ControllerHelpers

Как говорит одно из решений на StackOverflow

The Devise :: TestHelpers должен быть включен только для тестов контроллера, поэтому вам нужно переместить его в ActionController :: TestCase, добавив это к вашим помощникам тестирования:

  1. Then what to include for Helper test which inherits ActionView::TestCase
  2. How to test helpers in the Minitest framework.

Но я полагаю, include Devise::Test::IntegrationHelpers и include Devise::Test::ControllerHelpers предназначены для контроллеров для различных версий рельсов.

ошибка

enter image description here

Обновлена ​​трассировка стека ошибок

enter image description here

трассировка стека для тестового прогона

    CustomUserGroupsHelperTest: test_should_work_custom_user
    --------------------------------------------------------
    (0.1ms)  ROLLBACK
  E    (0.1ms)  BEGIN

1 Ответ

1 голос
/ 30 января 2020

Похоже, вы в корне неправильно поняли, что такое помощник в Rails и как вы должны их тестировать. Что действительно понятно, так как это очень расплывчатый термин и означает разные вещи в разных контекстах.

Помощники (как в /app/helpers) в приложении Rails - это просто модули, которые смешаны с контекстом представления и предоставляют простые вспомогательные методы для таких вещей, как генерация html или получение пользователя из сеанса в случае с Devise.

Тест, подобный следующему:

require 'test_helper'
class CustomUserGroupsHelperTest < ActionView::TestCase
  test "should work custom user" do
    post :save_custom_groups
    assert_equal "save_custom_groups", @controller.action_name
  end
end

Просто неверен во всех возможных случаях. Помощник не отвечает на методы HTTP. Это больше похоже на самую странную попытку в тестировании контроллера, когда-либо созданную.

Чтобы проверить помощников, вы должны просто протестировать его, как обычный старый метод. Дайте ему входные данные и проверьте выходные данные:

module ListHelper
  def ul(array)
    content_tag :ul do
      array.each do |obj|
        concat content_tag :li, obj
      end
    end
  end
end

class ListHelperTest < ActionView::TestCase
  test "should return the user's full name" do
    assert_dom_equal %{<ul><li>foo</li><li>bar</li></ul>}, ul(["foo", "bar"])
  end
end

Если вы тестируете помощника, который использует метод из Devise, такой как current_user, user_signed_in? et c, вы должны просто заглушить эти методы. Вспомогательный тест не является полным стеком и, следовательно, не имеет реального сеанса.

Вы можете заглушить другие вспомогательные методы в ActionView :: TestCase, вставив их в self. Например, если вы используете mocha, вы должны сделать:

class UsersHelperTest < ActionView::TestCase

  def setup
    @user = users(:david)
    self.stubs(:current_user).returns(@user)
  end

  test "should link to the current user" do
    assert_dom_equal %{<a href="/user/#{@user.id}">@user.name</a>}, link_to_current_user
  end
end

Devise::Test::IntegrationHelpers и Devise::Test::ControllerHelpers для интеграционных тестов и тестов контроллера, где вы фактически управляете большей частью фреймворка и совершенно не важны для вспомогательных тестов. Это примеры тестовых помощников, поведение которых вы смешиваете в своих тестах.

Конечно, вы можете косвенно тестировать помощников с помощью интеграционных тестов, которые отображают представление, где используется помощник, но поскольку помощники относительно просты, то это может быть хорошей идеей проверить их напрямую.

...