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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top