Pregunta

Esto es algo que ha estado volviendo loco en los últimos días. Tengo una acción que permite a los usuarios autenticados para cargar elementos al sitio. Sé que la acción del controlador es correcto que puedo correr a través del proceso de forma manual, sin embargo quiero probarlo con rspec.

Tengo que usar el ayudante request para que pueda volver a utilizar una sesión autenticada que es un :given para este conjunto de pruebas.

it "should allow authenticated file uploads" do
    file = File.open(a_valid_file)
    mock_file = mock("file")
    mock_file.stub!(:path).and_return(file.path)

    request( resource(:assets), :method => "POST",
        :params => { :file => 
            {:tempfile => mock_file, :filename => File.basename(file.path)} }
    )
end

Si punto de interrupción dentro de la especificación de que todo funciona muy bien, sin embargo cuando funciono con la especificación y tratar de acceder a la ruta de la acción del controlador a través del depurador me sale esto:

e file[:tempfile].path
NoMethodError Exception: undefined method `path' for "#[Spec::Mocks::Mock:0x3fda2a4736c0 @name=\"file\"]":String

Mi conjetura es que el stub!(:path) no se está creando por cualquier objeto de burla está haciendo a través de la solicitud.

La pregunta es: ¿Voy por el camino correcto para la carga de archivos de prueba y si no lo es otra manera

?
¿Fue útil?

Solución

lo estaba haciendo mal. Mediante el uso de request que estaba llamando to_s en todos los parametros, por lo que mi objeto de burla estaba siendo aprobada como "# [Spec :: :: Mocks Mock: 0x3fda2a4736c0 @ name = \" archivo \ "]". Eso me enseñará a prestar más atención a la salida de excepción.

En lugar de eso debería utilizar multipart_post y apagar las llamadas de autenticación en un bloque.

it "should allow authenticated file uploads" do
    file = File.open(a_valid_file)

    multipart_post( resource(:assets), :method => "POST", 
            :params => { :file => file } ) do |controller|
        controller.stub!(:ensure_authenticated).and_return(true)
        controller.session.stub!(:user).and_return(User.first)

    )
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top