Prueba de carga de archivos autenticados en merb
-
12-09-2019 - |
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
?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