2010-12-10 18 views
5

To jest tylko teoria, którą chciałbym wymyślić na podstawie opinii innych i być może podobnych doświadczeń.Django SQLite testujące osobliwość: inna ścieżka wykonania?

Używałem mySQL do uruchamiania testów, ale oczywiście baza pamięci SQLite w pamięci jest znacznie szybsza. Wydaje się jednak, że pojawiły się pewne problemy.

Kiedy DATABASE_ENGINE jest skonfigurowany do korzystania django.db.backends.sqlite3 i biegnę manage.py test wyjście nie jest, jak się spodziewano:

(usunięcie większości linii, ale wskazując interesujące punkty awarii)

 
$ 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() 

Istnieje wiele takie awarie, ale tylko wskazanie pary. Problem jest oczywisty. Model witryny nie zawiera rzeczywistych danych, ale pliki zawierają kod, który próbuje pobrać bieżące lub określone wystąpienia w modelu witryny.

Teraz mogę myśleć o łatwym rozwiązaniu: Że OneToOneField powinien być włączony, aby użyć funkcji z limit_choices_to, a drugi taki sam. Funkcje są następnie wywoływane w razie potrzeby, a nie podczas początkowego skanowania pliku przez Django.

Jednak moje aktualne pytanie brzmi: dlaczego tak się dzieje z SQLite, a nie z mySQL?. Czy jest inaczej sposób, w jaki dwa silniki bazy danych przetwarzają testy? Nie sądzę, że tak, ponieważ Python wykonuje całą kompilację modeli.

Co dokładnie się tutaj dzieje?

Pozdrawiam.

+0

Czy uważasz, że baza danych sqlite jest tworzona jako nowa i pusta za każdym razem, gdy uruchamiasz testy, podczas gdy baza danych mysql może być taka sama jak w przypadku produkcji/rozwoju i zawiera już więcej danych? –

+0

Baza danych mySQL jest również tworzona zupełnie nowa za każdym razem. – Bartek

+0

Gdzie wywołujesz Site.objects.get_current() w swoim modelu? Czy jest to metoda save() czy sygnał? –

Odpowiedz

1

Czy istnieje jakiś powód, dla którego nie jesteś mocking dostęp do bazy danych? Twoja granica UT staje się ogromnie szeroka po dodaniu bazy danych (bez względu na bazę danych) do mieszaniny. Zaczyna wyglądać bardziej jak test integracyjny niż test jednostkowy.