2014-02-24 15 views
5

Ich versuche, einen einfachen Django-Test mit einer tests.py Datei in einem Django App-Verzeichnis (mysite/polls/tests.py), aber jeder tun Mal, wenn ich ‚python manage.py Testumfragen‘ laufen lasse, erhalte ich die Fehlermeldung:Django Test Fehler "Berechtigung verweigert Datenbank erstellen" - Mit Heroku Postgres

C:\Python27\python.exe "C:\Program Files (x86)\JetBrains\PyCharm 3.0\helpers\pycharm\django_test_manage.py" test polls "C:\Users\<myname>\PycharmProjects\mysite" 
Testing started at 8:40 PM ... 
Creating test database for alias 'default'... 
Type 'yes' if you would like to try deleting the test database 'test_<database>', or 'no' to cancel: Got an error creating the test database: permission denied to create database 

Von dem, was ich gelesen habe, offenbar Heroku PG verwendet eine gemeinsame Datenbank, so dass ich nicht über die Berechtigung zum erstellen/zerstören Datenbanken, die zum Testen notwendig sind. Gibt es dafür eine offensichtliche Lösung? Ich entwickle immer noch auf meinem lokalen Laufwerk, so dass jede Umgehungslösung geschätzt würde. Ich weiß, dass Testen ein wichtiger Teil der Programmierung ist. Daher würde ich gerne in der Lage sein, eine Testmethode so schnell wie möglich zu implementieren.

Ich versuche, mit der TestCase Django-Klasse zu testen.

Was ich benutze:
1) Heroku Postgres Hobby Dev-Plan
2) Postgres 9.3.3
3) Python 2.7.6
4) Django 1.6.1


EDIT: Nach ein bisschen mehr Forschung, fand ich heraus, dass ich meine DATABASES dict-Variable in settings.py überschreiben kann, um mit SQLite lokal zu testen (wenn 'test' ein Argument in der Shell ist), aber ich würde trotzdem eine PostgreSQL-Implementierung bevorzugen Seit dem, was ich gelesen habe, ist PostgreSQL strenger (wovon ich ein Fan bin).

Für interessierte jedermann in der semi-Lösung habe ich (mit freundlicher Genehmigung von einem anderen Mitglied von Stackoverflow) gefunden:

if 'test' in sys.argv: 
    DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'} 

nicht sys zu importieren Vergessen.

Antwort

0

Es gibt keinen Grund für Sie, eine Datenbank mit Ihren Tests zu erstellen. Ändern Sie stattdessen Ihre Tests, um auf die lokale Datenbank zuzugreifen, wenn eine Umgebungsvariable DATABASE_URL nicht definiert ist. Hier ist, was ich in Node.js tun, wo ich lokalen Test und Entwickler Datenbanken haben, und eine Heroku bereitgestellten Produktion db:

if (typeof(process.env.DATABASE_URL) !== 'undefined') { 
    dbUrl = url.parse(process.env.DATABASE_URL); 
} 
else if (process.env.NODE_ENV === 'test') { 
    dbUrl = url.parse('tcp://postgres:[email protected]:5432/test'); 
} 
else { 
    dbUrl = url.parse('tcp://postgres:[email protected]:5432/db'); 
} 
+1

Djangos Tests in Isolation arbeiten, so dass jeder Test stellt eine neue Datenbank auf, läuft der Test, löscht dann diese Datenbank, um sicherzustellen, dass es keine Kreuzreden gibt, wenn Sie z. B. zählen oder beitreten. – Soviut

Verwandte Themen