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.

No se permiten consultas de base de datos a ‘nueva-base-de-datos’ en este test.

He añadido una nueva base de datos en mi proyecto Django. Ahora tengo problemas con mis casos de prueba. Me aparece este mensaje de error en cada uno de mis casos de prueba:

Las consultas de base de datos a ‘nueva-base-de-datos’ no están permitidas en esta prueba.

He buscado soluciones para este problema y la solución común es agregar ‘databases = ‘all” o ‘databases = {‘default’, ‘nueva_base_de_datos’}’ a la clase TestCase.

Pero el problema es que ahora tenemos muchos casos de prueba en nuestra aplicación Django y muchas clases basadas en TestCase correspondientes. Por lo que no parece adecuado (específicamente en términos de escala) agregar esta declaración ‘databases = ‘all” o lo que sea a cada clase.

¿Tenemos alguna otra solución más adecuada para este problema?

(Después de todo, ¿por qué Django necesita hacer transacciones a ‘nueva_base_de_datos’ en todos los demás casos de prueba cada vez que no parece necesario en absoluto?)

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Si ha añadido una nueva base de datos a su proyecto Django y está recibiendo el mensaje de error “Las consultas de la base de datos ‘nueva-base-de-datos’ no están permitidas en esta prueba” para todos sus casos de prueba, entonces la solución común es añadir databases = '__all__' o databases = {'default', 'nueva_base_de_datos'} a la clase TestCase. Sin embargo, si tiene muchos casos de prueba y clases basadas en TestCase correspondientes, esta solución puede resultar engorrosa y no escalable.

    Una solución alternativa es crear un programa personalizado para realizar pruebas que sólo ejecutará pruebas en la base de datos por defecto de manera predeterminada, y permitirá que pruebas específicas utilicen la nueva base de datos según sea necesario. Esto se puede hacer creando una subclase de DiscoverRunner de Django y sobrescribiendo el método setup_databases(). En este método, se puede comprobar el atributo databases de cada caso de prueba para ver si incluye la nueva base de datos. Si lo hace, se puede crear una conexión de base de datos separada para ese caso de prueba y añadirlo al diccionario connections. Si no lo hace, se puede simplemente usar la conexión de base de datos por defecto.

    Aquí hay un ejemplo de cómo podría verse el programa personalizado para realizar pruebas:

    from django.test.runner import DiscoverRunner
    
    class CustomTestRunner(DiscoverRunner):
        def setup_databases(self, **kwargs):
            # Usa la base de datos por defecto para todas las pruebas de manera predeterminada
            connections['nueva_base_de_datos'].disable_schema_check = True
            return super().setup_databases(**kwargs)
    
        def teardown_databases(self, old_config, **kwargs):
            # Desmantela la conexión de la nueva base de datos si se creó
            if hasattr(connections, 'nueva_base_de_datos'):
                connections['nueva_base_de_datos'].close()
            return super().teardown_databases(old_config, **kwargs)
    
        def build_suite(self, *args, **kwargs):
            suite = super().build_suite(*args, **kwargs)
            for test_case in suite:
                # Si el caso de prueba especifica la nueva base de datos, crea una nueva conexión de base de datos
                if 'nueva_base_de_datos' in getattr(test_case, 'databases', []):
                    connections.ensure_defaults(alias='nueva_base_de_datos')
            return suite
    

    Con este programa personalizado para realizar pruebas, puede especificar la nueva base de datos sólo para los casos de prueba que lo requieran, sin tener que añadir databases = '__all__' o databases = {'default', 'nueva_base_de_datos'} a cada clase. Simplemente especifique la nueva base de datos en el atributo de databases de los casos de prueba que lo requieran, así:

    class MyTestCase(TestCase):
        databases = {'default', 'nueva_base_de_datos'}
    
        def test_something(self):
            # Usa la conexión de la nueva base de datos para esta prueba
            ...
    

    Esta solución debería ser más escalable y fácil de mantener que añadir el atributo databases a cada clase de caso de prueba.

Comments are closed.