¿Cómo limpiar manualmente el DB en una prueba de Django?

Estoy usando: pitón = "3.8.3", django="3.0.5"

He escrito una prueba de django con APITestCase. Estoy haciendo otras pruebas dentro de mi clase de pruebas. Estoy tratando de llamar a otras funciones dentro de mi clase de prueba. Para hacer esto tengo un diccionario en una lista que mapeé así:

[
   {
      "class_name": class_name,
      "func_name": "test_add_product", # Comes test name
      "trigger_type": trigger_type, # Comes from model choices field.
      "request_type": RequestTypes.POST,
      "success": True,
   },
   {
       ...
   },

]

Voy a buclear estos con un bucle y correr cada uno. Después de cada bucle db debe ser aclarado para no obtener error. Intenté hacer esto usando:

# Lets say that, we have a Foo model
Foo.objects.all().delete()

Este método funciona, pero quiero una mejor solución.

¿Cómo puedo limpiar manualmente la prueba antes de que termine la prueba?

Pregunta hecha hace 3 años, 4 meses, 26 días - Por algorithmwizard


3 Respuestas:

  • puedes hacer esto

    from django.test import Client, TestCase
    
    class TestsDB(TestCase):
        def __init__(self):
           self.e = Client()
        def test_delete_db(self):
            foo = Foo.objects.all()
            foo.delete()
        
    

    Respondida el Dec 20, 2020 a las 22:50 - por pythonpirate

    Votos positivos: 0 | Votos negativos: 0

  • Para limpiar manualmente la base de datos de Django dentro de una prueba, puedes hacer uso de la clase TestCase y su método setUp() y tearDown(). Estos métodos te permiten configurar el entorno antes de que se ejecute cada prueba y limpiarlo después de que se haya ejecutado la prueba.

    Aquí tienes un ejemplo de cómo puedes limpiar la base de datos manualmente dentro de una prueba en Django:

    python
    from django.test import TestCase
    from myapp.models import Foo
    
    class MyTestCase(TestCase):
    
        def setUp(self):
            

    Configuración inicial de la prueba, es decir, crear registros en la base de datos si es necesario

    pass def tearDown(self):

    Limpiar la base de datos después de cada prueba

    Foo.objects.all().delete() def test_my_func(self):

    Código de prueba que requiere limpiar la base de datos

    Aquí iría tu bucle y código de prueba

    En este ejemplo, setUp() se ejecutará antes de cada prueba y tearDown() se ejecutará después de cada prueba, lo que garantizará que la base de datos se limpie adecuadamente antes de que finalice cada prueba.

    Reemplaza MyTestCase, myapp y Foo con tus propias clases y modelos de tu aplicación para que funcione correctamente en tu entorno. Espero que esta solución te ayude a limpiar la base de datos manualmente de forma más organizada en tus pruebas de Django.

    Respondida el Dec 21, 2020 a las 22:46 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para limpiar manualmente la base de datos en una prueba de Django, puedes usar el método tearDown en tu clase de prueba. Este método se ejecuta después de cada método de prueba y te permite realizar acciones de limpieza.

    Para limpiar la base de datos, puedes usar el método flush(). Este método elimina todos los objetos de la base de datos, incluidas las tablas creadas por aplicaciones de terceros.

    Aquí tienes un ejemplo de cómo puedes usar el método tearDown para limpiar la base de datos:

    
    from django.db import connection
    
    class MyTestCase(APITestCase):
    
        def tearDown(self):
            cursor = connection.cursor()
            cursor.execute('TRUNCATE TABLE myapp_mymodel')  

    Cambia 'myapp_mymodel' por el nombre de tu tabla

    cursor.close()

    Este método eliminará todos los objetos de la tabla myapp_mymodel después de cada método de prueba.

    Nota: No olvides ejecutar connection.close() al final para liberar el cursor.

    Otra opción:

    Otra forma de limpiar la base de datos es utilizar el decorador @override_settings. Este decorador te permite anular temporalmente la configuración de Django para la duración de la prueba. Puedes usarlo para apuntar a una base de datos diferente o para utilizar un motor de base de datos diferente.

    Aquí tienes un ejemplo de cómo puedes usar el decorador @override_settings para limpiar la base de datos:

    
    from django.test import override_settings
    
    class MyTestCase(APITestCase):
    
        @override_settings(DATABASES={'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:'}})
        def test_something(self):
            

    Tu código de prueba aquí

    En este ejemplo, el decorador @override_settings anula temporalmente la configuración de la base de datos para utilizar una base de datos SQLite en memoria. Esto significa que todos los cambios realizados en la base de datos durante la prueba se descartarán una vez finalizada la prueba.

    Respondida el Dec 21, 2020 a las 22:52 - por Gemini

    Votos positivos: 0 | Votos negativos: 0