2010-12-10 9 views
5

Esto es simplemente una teoría que me gustaría averiguar en base a comentarios de otros y quizás experiencias similares.Django SQLite prueba rareza: ¿diferente camino de ejecución?

He estado usando mySQL para ejecutar pruebas, pero por supuesto una base de datos SQLite en memoria es mucho más rápida. Sin embargo, parece haber tenido algunos problemas.

Cuando DATABASE_ENGINE está configurado para utilizar django.db.backends.sqlite3 y corro manage.py test, la salida no es como se esperaba:

(la mayoría de las líneas eliminadas, pero señalando puntos interesantes de fracaso)

 
$ python manage.py test 
Traceback (most recent call last): 
    File "manage.py", line 12, in 
    execute_manager(settings) 
    File "/Users/bartekc/.virtualenvs/xx/lib/python2.6/site-packages/django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 51, in 
    class AcvTripIncentive(models.Model): 

    # First interesting failure 
    File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 55, in AcvTripIncentive 
    trip = models.OneToOneField(Trip, limit_choices_to={'sites' : Site.objects.get(name='ZZ'), 'is_active' : True,}) 

    # Next interesting failure 
    File "/Users/bartekc/domains/xx/xx/associates/yyz/models.py", line 252, in 
    current_site = Site.objects.get_current() 

hay múltiples fallas como esta pero solo señalando un par. El problema es obvio El modelo de sitio no tiene datos reales, pero los archivos contienen código que intenta obtener las instancias actuales o específicas en el modelo del sitio.

Ahora, puedo pensar en una solución fácil: OneToOneField se debe cambiar para usar una función con limit_choices_to, y la segunda es la misma. Las funciones se llaman cuando es necesario, no en el escaneo inicial del archivo por Django.

Sin embargo, mi pregunta real es: ¿Por qué sucede esto con SQLite y no mySQL?. ¿Hay alguna manera diferente en que los dos motores de base de datos procesen mediante pruebas? No lo creo, ya que Python está haciendo todas las compilaciones de los modelos.

¿Qué está pasando exactamente aquí?

Saludos.

+0

¿Consideró que la base de datos sqlite se crea recientemente y está vacía cada vez que ejecuta las pruebas, mientras que la base de datos mysql puede ser la misma que utiliza para producción/desarrollo y ya tiene más datos? –

+0

La base de datos mySQL también se crea nueva cada vez. – Bartek

+0

¿Dónde llamas Site.objects.get_current() en tu modelo? ¿Está en el método save() o en una señal? –

Respuesta

0

¿Está cargando objetos de su sitio desde un dispositivo?

Si es así, quizás esté tropezando con un problema conocido con MySQL y las transacciones. Haga una búsqueda de texto para "MySQL y accesorios" en esta página: http://docs.djangoproject.com/en/dev/ref/django-admin/?from=olddocs

+0

No está utilizando dispositivos para el objeto de Sitio, y el problema persiste solo con SQLite :( – Bartek

1

¿Hay alguna razón por la cual no está mocking acceso a la base de datos? Su límite UT se amplía enormemente cuando agrega una base de datos (sin importar la base de datos) a la mezcla. Comienza a parecerse más a una prueba de integración que a una prueba unitaria.