Comment puis-je tester des vues dans un plugin Rails?
-
06-07-2019 - |
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?
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.