Question

J'écris un plugin Rails qui inclut des partiels. J'aimerais tester les partiels, mais j'ai du mal à mettre en place un test qui les rendra. Il n'y a pas de contrôleur associé, alors je simule un:

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

Mais cet appel : render explose toujours. J'ai essayé d'utiliser ActionView :: Base au lieu d'un ActionController :: Base , mais cela va encore moins loin.

Quelqu'un at-il eu un succès?

Était-ce utile?

La solution 2

La réponse finale:

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

Autres conseils

checkout ActionView :: TestCase - http://api.rubyonrails.org/classes /ActionView/TestCase.html

Vous pouvez également les utiliser pour tester des aides, ce que j'ai trouvé extrêmement utile.

RSpec dispose également d’un moyen de tester les vues: http://rspec.info/ documentation / rails / write / views.html

J'espère que ça aide!

Le plus proche que j'ai eu est

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

Mais je reçois maintenant une erreur de routage: ActionController :: RoutingError: Aucune route ne correspond à {: action = > " _renderizer " ;,: controller = > ",: args = > {: locals = > {: ...},: partial = > "/ my_partial"}}

Je vous suggère de consulter le code du plug-in resource_controller . J'ai également vu l'approche dans quelques autres plugins.

La réponse est simple: dans le répertoire test , vous créez une application qui utilise votre plug-in. À partir de là, vous utilisez simplement les outils courants pour tester les vues Rails.

L'application de test peut être extrêmement simple s'il n'y a pas beaucoup de cas d'utilisation différents pour votre plugin. Dans le cas de plugins plus complexes, tels que resource_controller, vous devrez probablement créer pas mal de contrôleurs différents et ainsi de suite.

Pour inciter votre application de test à charger votre plug-in, le moyen le plus simple consiste à créer un lien vers la racine du répertoire r_c à l'intérieur du répertoire de plug-in de l'application de test. Cela ne fonctionnera pas sous Windows, mais uniquement avec les systèmes d’exploitation POSIX.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top