es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo detener a Active Storage Rails 6 de borrar archivos adjuntos de fixtures durante las pruebas de acción de eliminación.

Cuando se empieza con una base de datos de pruebas con semillas, también conocidas como fixtures, se utilizan pruebas transaccionales. La base de datos se “reinicia” al punto de inicio de cada prueba. Esto funciona perfectamente excepto cuando se ejecuta una prueba en la que se elimina/purga un modelo que tiene una referencia de almacenamiento activa. El archivo se elimina del almacenamiento local de pruebas y todas las demás pruebas fallan. El blob y el archivo adjunto se restablecen, pero el archivo ha sido purgado del sistema de archivos. ¿Existe una configuración que se pueda activar para cambiar esto? He intentado buscar en Google, pero no he encontrado un error decente.

Usando Rails 6/Rspec

Considere:

  • antes de ejecutar las pruebas, se crea una serie de registros (fixtures), Foo has_one attachment. (estado de la base de datos 0)
  • se ejecuta una prueba de eliminación, como una prueba de controlador que elimina un Foo y Active Storage purga su archivo del almacenamiento local.
  • después de que la prueba se haya completado, se reinicia la base de datos al estado 0. Por lo tanto, el registro Foo vuelve a estar presente y el archivo y el blob de Active Storage se restauran, pero el archivo local para ese blob no se ha restaurado.
  • se ejecutan el siguiente conjunto de pruebas para ese Foo y fallan porque el archivo no existe.
Tags:  ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no hay una configuración incorporada en Rails o RSpec que pueda restaurar archivos eliminados del almacenamiento de pruebas locales cuando se usan pruebas transaccionales. Esto se debe a que las pruebas transaccionales utilizan transacciones de base de datos para deshacer los cambios en la base de datos después de cada prueba, pero los sistemas de archivos están fuera del alcance de las transacciones de la base de datos.

    Una solución alternativa podría ser utilizar un servicio de almacenamiento diferente para las pruebas, como Amazon S3, Google Cloud Storage o Microsoft Azure Blob Storage, que permiten la versionado y se pueden restaurar a una versión anterior. Alternativamente, podría simular el archivo adjunto para que no elimine realmente el archivo del almacenamiento local durante las pruebas. Esto se puede lograr mediante el uso de stub o double en sus pruebas para reemplazar el método purge del archivo adjunto con un método ficticio que no hace nada. Por ejemplo:

    foo = FactoryBot.create(:foo)
    attachment = foo.attachment
    
    # Simular el método "purge" para que no haga nada
    allow(attachment).to receive(:purge).and_return(nil)
    
    # Eliminar el registro "foo"
    foo.destroy!
    
    # La base de datos se restablece, pero el archivo local no se elimina
    expect(File.exist?(attachment.path)).to be_truthy
    

    Tenga en cuenta que este enfoque solo evita que se elimine el archivo durante las pruebas, no restaura un archivo eliminado. Por lo tanto, se recomienda utilizar una estrategia de respaldo para el almacenamiento de pruebas, o utilizar un servicio de almacenamiento diferente que proporcione versionado en caso de eliminación accidental de archivos de prueba.

Comments are closed.