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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top