¿Cómo puedo probar las vistas en un complemento de Rails?
-
06-07-2019 - |
Pregunta
Estoy escribiendo un complemento Rails que incluye algunos parciales. Me gustaría probar los parciales, pero tengo dificultades para configurar una prueba que los muestre. No hay un controlador asociado, así que solo estoy fingiendo 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
Pero esa llamada : render
siempre explota. Intenté usar un ActionView :: Base
en lugar de un ActionController :: Base
, pero eso va aún menos lejos.
¿Alguien ha tenido algún éxito?
Solución 2
La respuesta 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
Otros consejos
checkout ActionView :: TestCase - http://api.rubyonrails.org/classes /ActionView/TestCase.html
También puede usarlos para probar ayudantes, lo que me ha resultado extremadamente útil.
RSpec también tiene una forma de probar vistas: http://rspec.info/ documentation / rails / writing / views.html
¡Espero que eso ayude!
Lo más cerca que he llegado es
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
Pero ahora aparece un error de enrutamiento: ActionController :: RoutingError: ninguna ruta coincide {: action = > " _renderizer " ;,: controller = > " " ;,: args = > {:: locals = > {: ...},: partial = > " / my_partial "}}
Le sugiero que mire el código del recurso_controlador . También he visto el enfoque en algunos otros complementos.
La respuesta es simple: en el directorio prueba , crea una aplicación que utiliza su complemento. A partir de ahí, simplemente use las herramientas comunes para probar las vistas de Rails.
La aplicación de prueba puede ser extremadamente simple si no hay muchos casos de uso diferentes para su complemento. En el caso de complementos más complejos, como resource_controller, probablemente tendrá que crear bastantes controladores diferentes, etc.
Para engañar a su aplicación de prueba para que cargue su complemento, la forma más sencilla es crear un enlace a la raíz del directorio r_c dentro del directorio de complementos de la aplicación de prueba. Esto no funcionará en Windows, solo en sistemas operativos POSIX.