Похоже, вы в корне неправильно поняли, что такое помощник в 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
для интеграционных тестов и тестов контроллера, где вы фактически управляете большей частью фреймворка и совершенно не важны для вспомогательных тестов. Это примеры тестовых помощников, поведение которых вы смешиваете в своих тестах.
Конечно, вы можете косвенно тестировать помощников с помощью интеграционных тестов, которые отображают представление, где используется помощник, но поскольку помощники относительно просты, то это может быть хорошей идеей проверить их напрямую.