Como posso testar vistas em um Rails plugin?
-
06-07-2019 - |
Pergunta
Eu estou escrevendo um Rails plugin que inclui algumas parciais. Eu gostaria de testar os parciais, mas eu estou tendo um momento difícil a criação de um teste que irá torná-los. Não há nenhum controlador associado, então eu só estou fingindo um:
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
Mas essa chamada :render
sempre explode. Eu tentei usar um ActionView::Base
em vez de um ActionController::Base
, mas isso fica ainda menos agora.
Alguém já teve algum sucesso?
Solução 2
A resposta final:
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
Outras dicas
Caixa ActionView :: TestCase - http://api.rubyonrails.org/classes /ActionView/TestCase.html
Você também pode usá-los para ajudantes de teste, que eu achei extremamente útil.
RSpec também tem uma maneira de vista de teste: http://rspec.info/ documentação / rails / escrita / views.html
Espero que ajude!
O mais próximo que eu comecei é
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
Mas eu recebo um erro de roteamento agora: ActionController::RoutingError: No route matches {:action=>"_renderizer", :controller=>"", :args=>{:locals=>{:...}, :partial=>"/my_partial"}}
Eu sugiro que você olhar para o código para o resource_controller plug-in . Eu também vi a abordagem em alguns outros plugins.
A resposta é simples, na test diretório, você cria um aplicativo que usa o seu plugin. A partir daí, basta usar as ferramentas comuns para teste de Rails vistas.
O aplicativo de teste pode ser extremamente simples, se não há muitos casos de uso diferentes para o seu plugin. No caso dos plugins mais complexos, como resource_controller, você provavelmente vai ter que criar muito poucos controladores diferentes e assim por diante.
Para enganar o seu aplicativo de teste para carregar o plugin, a maneira mais simples é criar um link para a raiz do diretório rc dentro do diretório do plugin do aplicativo de teste. Isso não vai funcionar no Windows, apenas a POSIX sistemas operacionais.