2012-09-21 11 views
5

Tengo un helper que tiene acceso a request.fullpath. Dentro de una prueba auxiliar aislada, request no está disponible. ¿Que debería hacer? ¿Puedo burlarme de alguna manera o algo así?Rieles: prueba a un ayudante que necesita acceso al entorno Rails (por ejemplo, request.fullpath)

Estoy usando las versiones más recientes de Rails y RSpec. Esto es lo que se ve como mi ayudante:

def item(*args, &block) 
    # some code 

    if request.fullpath == 'some-path' 
    # do some stuff 
    end 
end 

Así que la línea de código problemática es # 4 en el que el ayudante necesita acceder al objeto request que no está disponible en la especificación ayudante.

Muchas gracias por ayuda.

+0

¿Tiene un "require 'rspec/rieles'" en su spec_helper.rb? – Rubyman

+0

Sí, lo hago. Gracias. –

Respuesta

4

Sí, puede burlarse de la solicitud. Tengo una respuesta larga aquí que describe cómo hacer eso, pero de hecho eso no es necesariamente lo que quieres.

Simplemente llame a su método de ayuda en el objeto auxiliar en su ejemplo. De la misma manera:

describe "#item" do 
    it "does whatever" do 
    helper.item.should ... 
    end 
end 

Eso le dará acceso a un objeto de solicitud de prueba. Si es necesario especificar un valor específico para la ruta de solicitud, puede hacerlo de esta manera:

before :each do 
    helper.request.path = 'some-path' 
end 

En realidad, para lo completo, deja que incluyo mi respuesta original, ya que dependiendo de lo que está intentando hacerlo puede ser útil.

Así es como se puede burlarse de la solicitud:

request = mock('request') 
controller.stub(:request).and_return request 

Puede agregar métodos de derivación a la petición devuelta de manera similar

request.stub(:method).and_return return_value 

Y sintaxis alternativa para burlarse & talón de todos en una sola línea:

request = mock('request', :method => return_value) 

Rspec se quejará si su simulacro recibe messa ges que no has tropezado. Si hay otras cosas Simplemente llame a su método de solicitud de ayuda sobre el objeto auxiliar que hace que no le importe su prueba, puede cerrar rspec haciendo que la simulación sea un "objeto nulo", por ejemplo. Al igual que como

request = mock('request').as_null_object 

Parece que todo lo que probablemente necesita para obtener su aprobación prueba específica es la siguiente:

describe "#item" do 
    let(:request){ mock('request', :fullpath => 'some-path') } 

    before :each do 
    controller.stub(:request).and_return request 
    end 

    it "does whatever" 
end 
+0

Ignora mi respuesta anterior. Describió cómo simular el objeto de solicitud, pero esa no es necesariamente la forma correcta de obtener lo que desea en una especificación auxiliar. Véase más arriba. – gregates

+0

Muchas gracias, funciona como un encanto. Aún así, estoy un poco inseguro, por qué lo hace. ¿La llamada directa a 'helper.my_method' no es lo mismo que la simple llamada' my_method'? Al probar los ayudantes, ¿siempre debo llamarlos al objeto 'helper'?¿Hay un objeto similar para los controladores y las pruebas de vistas? –

+1

¡Hay! hay muchas cosas interesantes que puedes hacer con controladores anónimos; rspec-rails te da un objeto 'controller' que hereda de ApplicationController, y puedes definir acciones de stub para probar before_filters o lo que sea. Honestamente, no estoy seguro de ser lo suficientemente experto como para explicar por qué necesitas llamar a tu método sobre el objeto 'helper'. Recomiendo estudiar los documentos de rspec en https://www.relishapp.com/rspec/rspec-rails/v/2-11 si desea obtener más información. – gregates

0

En una especificación ayudante, puede acceder a la solicitud utilizando controller.request (por lo controller.request.stub(:fullpath) { "whatever" } debería funcionar)

+0

Gracias, pero esto no parece hacer que el objeto 'request' esté disponible en el helper (que es el problema). –

Cuestiones relacionadas