Как вы тестируете метод контроллера Rails, представленный как helper_method? - PullRequest
19 голосов
/ 15 марта 2010

Похоже, они не доступны из ActionView :: TestCase

Ответы [ 5 ]

35 голосов
/ 22 марта 2010

Правильно, вспомогательные методы не показываются в тестах вида - но они могут быть проверены в ваших функциональных тестах. И поскольку они определены в контроллере, это подходящее место для их проверки. Ваш вспомогательный метод, вероятно, определен как private, поэтому вам придется использовать метапрограммирование Ruby для вызова метода.

приложение / контроллеры / posts_controller.rb:

class PostsController < ApplicationController

  private

  def format_something
    "abc"
  end
  helper_method :format_something
end

тест / функционал / posts_controller_test.rb:

require 'test_helper'

class PostsControllerTest < ActionController::TestCase
  test "the format_something helper returns 'abc'" do
    assert_equal 'abc', @controller.send(:format_something)
  end
end
4 голосов
/ 25 ноября 2013

Это неудобно, потому что вы обходите инкапсуляцию, используя метод send on private.

Лучший подход - поместить вспомогательный метод в модуль в каталоге / controller / Concert и создать тесты специально для этого модуля.

например. в контроллере приложения / posts_controller.rb

class PostsController < ApplicationController
  include Formattable
end

в приложении / контроллере / задачах / formattable.rb

  module Concerns
    module Formattable
      extend ActiveSupport::Concern # adds the new hot concerns stuff, optional

      def format_something
        "abc"
      end
    end
  end

А в тесте / функционал / касается / formattable_test.rb

require 'test_helper'

# setup a fake controller to test against
class FormattableTestController
  include Concerns::Formattable
end

class FormattableTest < ActiveSupport::TestCase

 test "the format_something helper returns 'abc'" do
    controller = FormattableTestController.new
    assert_equal 'abc', controller.format_something
  end

end
2 голосов
/ 06 ноября 2016

Вы можете проверить @controller.view_context из ваших тестов функциональности / контроллера. Насколько я могу судить, этот метод доступен в Rails 3, 4 и 5.

приложение / контроллеры / application_controller.rb

class ApplicationController < ActionController::Base
  helper_method :current_user
  # ...
end

тест / контроллеры / application_controller_test.rb

require 'test_helper'

class ApplicationControllerTest < ActionController::TestCase
  test 'current_user helper exists in view context' do
    assert_respond_to @controller.view_context, :current_user
  end
end

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

class ApplicationControllerHelperTest < ActionController::TestCase
  class TestController < ApplicationController
    private
    def current_user
      User.new
    end
  end

  tests TestController

  test 'current_user helper exists in view context' do
    assert_respond_to @controller.view_context, :current_user
  end

  test 'current_user returns value from controller' do
    assert_instance_of User, @controller.view_context.current_user
  end
end

Или, более вероятно, вы захотите проверить помощника при наличии запроса.

class ApplicationControllerHelperTest < ActionController::TestCase
  class TestController < ApplicationController
    def index
      render plain: 'Hello, World!'
    end
  end

  tests TestController

  def with_routing
    # http://api.rubyonrails.org/classes/ActionDispatch/Assertions/RoutingAssertions.html#method-i-with_routing
    # http://guides.rubyonrails.org/routing.html#connecting-urls-to-code
    super do |set|
      set.draw do
        get 'application_controller_test/test', to: 'application_controller_test/test#index'
      end

      yield
    end
  end

  test 'current_user helper exists in view context' do
    assert_respond_to @controller.view_context, :current_user
  end

  test 'current_user returns value from controller' do
    with_routing do
      # set up your session, perhaps
      user = User.create! username: 'testuser'
      session[:user_id] = user.id

      get :index
      assert_equal user.id, @controller.view_context.current_user.id
    end
  end
end
0 голосов
/ 11 января 2018

Я немного боролся с этим, потому что принятый ответ на самом деле не проверял, был ли метод представлен как вспомогательный метод.

Тем не менее, мы можем использовать метод #helpers, чтобы получить прокси для тестирования.

Например:

class FooController < ApplicationController
  private

  def bar
    'bar'
  end

  helper_method :bar
end

Может быть протестирован с:

require 'test_helper'

class FooControllerTest < ActionController::TestCase
  test 'bar is a helper method' do
    assert_equal 'bar', @controller.helpers.bar
  end
end
0 голосов
/ 15 марта 2010

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

...