Как я могу проверить представления в плагине Rails?
-
06-07-2019 - |
Вопрос
Я пишу плагин Rails, который включает в себя некоторые особенности. Я хотел бы проверить партиалы, но мне сложно настроить тест, который будет их визуализировать. Нет связанного контроллера, поэтому я просто притворяюсь:
require 'action_controller'
require 'active_support'
require 'action_pack'
require 'action_view'
class MyTest < Test::Unit::TestCase
def setup
@renderer = ActionController::Base.new
@renderer.append_view_path File.expand_path(File.join(File.dirname(__FILE__), '..', 'views'))
end
def test_renders_link
result = @renderer.render(:partial => '/something')
assert ...
end
end
Но этот вызов : render
всегда взрывается. Я попытался использовать ActionView :: Base
вместо ActionController :: Base
, но это еще более далеко.
У кого-нибудь был какой-либо успех?
Решение 2
Окончательный ответ:
require 'action_controller'
require 'active_support'
require 'action_pack'
require 'action_view'
require 'action_controller/test_case'
class StubController < ActionController::Base
helper MyHelper
append_view_path '...'
attr_accessor :thing
def my_partial
render :partial => '/my_partial', :locals => { :thing => thing }
end
def rescue_action(e) raise e end;
end
class MyTestCase < ActionController::TestCase
self.controller_class = StubController
def setup
@controller.thing = ...
get :my_partial
assert ...
end
end
Другие советы
оформить заказ ActionView :: TestCase - http://api.rubyonrails.org/classes /ActionView/TestCase.html р>
Вы также можете использовать их для тестирования помощников, которые я считаю чрезвычайно полезными.
В RSpec также есть способ проверки представлений: http://rspec.info/ документация / рельсы / записи / views.html
Надеюсь, это поможет!
Самое близкое, что я получил, это
require 'action_controller'
require 'active_support'
require 'action_pack'
require 'action_view'
require 'action_controller/test_case'
class StubController < ActionController::Base
append_view_path '...'
def _renderizer; render params[:args]; end
def rescue_action(e) raise e end;
end
class MyTest < ActionController::TestCase
self.controller_class = StubController
def render(args); get :_renderizer, :args => args; end
def test_xxx
render :partial => ...
end
end
Но теперь я получаю ошибку маршрутизации: ActionController :: RoutingError: Нет совпадений с маршрутом {: action = & got; _renderizer " ;,: controller = > " ;,: args = > {: locals = > {: ...},: частичный = > " / my_partial "}}
Я предлагаю вам взглянуть на код плагина resource_controller . Я также видел подход в нескольких других плагинах.
Ответ прост: в каталоге test вы создаете приложение, использующее ваш плагин. Оттуда вы просто используете общие инструменты для тестирования представлений Rails.
Тестовое приложение может быть очень простым, если для вашего плагина не так много вариантов использования. В случае более сложных плагинов, таких как resource_controller, вам, вероятно, придется создать довольно много разных контроллеров и т. Д.
Чтобы заставить тестовое приложение загружать плагин, самый простой способ - создать ссылку на корень каталога r_c внутри каталога плагинов тестового приложения. Это не сработает в Windows, только в операционных системах POSIX.