Вопрос

Я пишу плагин 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top