2011-02-28 20 views
14

Estoy intentando probar un método en el controlador de aplicación que se utilizará como filtro anterior. Para hacer esto, configuré un controlador anónimo en mi prueba con el filtro anterior aplicado para garantizar que funcione correctamente.Vista de apilamiento Rspec para controlador anónimo

La prueba actualmente tiene el siguiente aspecto:

describe ApplicationController do 
    controller do 
    before_filter :authenticated 

    def index  
    end 
    end 

    describe "user authenticated" do 
    let(:session_id){"session_id"} 
    let(:user){OpenStruct.new(:email => "[email protected]", :name => "Colin Gemmell")} 

    before do 
     request.cookies[:session_id] = session_id 
     UserSession.stub!(:find).with(session_id).and_return(user) 
     get :index 
    end 

    it { should assign_to(:user){user} } 

    end 
end 

Y el controlador de aplicación es la siguiente:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    def authenticated 
    @user = nil 
    end 
end 

Mi problema es cuando cada vez que ejecute la prueba de que estoy recibiendo el siguiente error

1) ApplicationController user authenticated 
    Failure/Error: get :index 
    ActionView::MissingTemplate: 
    Missing template stub_resources/index with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml, :haml], :formats=>[:html], :locale=>[:en, :en]} in view paths "#<RSpec::Rails::ViewRendering::PathSetDelegatorResolver:0x984f310>" 

Según los documentos, la vista no es rendered when running controller tests, pero esto apunta a que no stub existente para esta acción (que es comprensible ya que la vista no existe)

Cualquier persona tiene una idea de cómo resolver este problema o resueltamente la vista.

Saludos Colin G

Respuesta

18

¿No podría conseguir alrededor de esto poniendo:

render :nothing => true 

dentro de la acción #index?

+0

Funcionó como un regalo. – pythonandchips

2

A menos que las cosas cambien de this blog post, RSpec 2 necesita un archivo de plantilla de vista para que las especificaciones del controlador funcionen. El archivo en sí no se procesa (a menos que agregue render_views), por lo que el contenido no importa; de hecho, puede simplemente agregar un archivo vacío con touch index.html.erb.

+0

Tuve que agregar plantillas ficticias en "app/views/anonymous/index.html.erb". No pude encontrar la forma de eliminar las vistas ficticias bajo especificaciones/vistas. – Rob

+0

Lo tienes bien: la plantilla vacía va en 'app/views', no' spec/views', lo cual tiene sentido, ya que es ahí donde Rails lo busca. – zetetic

+0

puede indicarle que busque las vistas ficticias en especificaciones/vistas si agrega la siguiente línea a la aplicación.rb: '# agrega un directorio de vista para las pruebas de controlador anónimo ' config.paths ['app/views'] < <"spec/views" si Rails.env.test? ' – Rob

2

Una mejor forma de hacerlo es crear un directorio de vistas ficticias. No usaría especificaciones/vistas, ya que eso es en realidad para las pruebas de vista válidas. En su lugar, crear esta estructura de directorios:

spec/test_views/anonymous 
    index.html.erb 
    ... and any other anonymous controller templates you happen to need ... 

index.html.erb puede estar vacía, como se ha señalado, ya que sólo se rspec2 es la comprobación de la existencia, no por el contenido.

Luego, en su inicializador application.rb, coloque esta línea:

# add a view directory for the anonymous controller tests 
config.paths['app/views'] << "spec/test_views" if Rails.env.test? 

Nota: He intentado poner esta línea en test.rb, para no parece trabajar allí alguna razón.

Cuestiones relacionadas