Come posso testare le viste in un plug-in Rails?
-
06-07-2019 - |
Domanda
Sto scrivendo un plug-in Rails che include alcuni parziali. Mi piacerebbe testare i parziali, ma sto facendo fatica a impostare un test che li renderà. Non esiste un controller associato, quindi ne sto solo fingendo uno:
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
Ma quella chiamata : render
esplode sempre. Ho provato a usare un ActionView :: Base
invece di un ActionController :: Base
, ma è ancora meno lontano.
Qualcuno ha avuto qualche successo?
Soluzione 2
La risposta 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
Altri suggerimenti
controlla ActionView :: TestCase - http://api.rubyonrails.org/classes /ActionView/TestCase.html
Puoi anche usarli per testare gli helper, che ho trovato estremamente utili.
RSpec ha anche un modo per testare le viste: http://rspec.info/ documentazione / guide / scrittura / views.html
Spero che ti aiuti!
Il più vicino che ho ottenuto è
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
Ma adesso ricevo un errore di routing: ActionController :: RoutingError: nessuna route corrisponde a {: action = > " _renderizer " ;,: controller = > " " ;,: args = > {: locals = > {: ...},: partial = > " / my_partial "}}
Ti suggerisco di guardare il codice per il plugin_controller risorse . Ho anche visto l'approccio in alcuni altri plugin.
La risposta è semplice, nella directory test , crei un'app che utilizza il tuo plug-in. Da lì, basta semplicemente usare gli strumenti comuni per testare le viste di Rails.
L'app di test può essere estremamente semplice se non ci sono molti casi d'uso diversi per il tuo plugin. Nel caso di plugin più complessi, come resource_controller, probabilmente dovrai creare diversi controller e così via.
Per ingannare l'app di test nel caricamento del plug-in, il modo più semplice è creare un collegamento alla radice della directory r_c all'interno della directory del plug-in dell'app di test. Questo non funzionerà su Windows, solo sui sistemi operativi POSIX.