2013-03-04 6 views
15

io ho la seguente struttura del progettoDjango py.test non trova il modulo impostazioni

base 
    __init.py 
    settings 
     __init__.py 
     settings.py 
    tests 
     pytest.ini 
     test_module.py 

mio pytest.ini assomiglia a questo:

[pytest] 
#DJANGO_SETTINGS_MODULE =base.settings.settings 

mio test_module.py assomiglia a questo:

def test_django(): 
    from base.settings import settings as base_settings 
    from django.conf import settings as django_settings 
    assert 3==5 

Quando eseguo ora:

py.test 

eseguirà le importazioni senza problemi e genererà un errore a assert 3==5 (come previsto). Questo mi dice che la base è sys.path e che è possibile importare base.settings.settings.

Ora posso cambiare test_module.py a:

def test_django(): 
    from base.settings import settings as base_settings 
    from django.conf import settings as django_settings 
    print django_settings.xxx 
    assert 3==5 

Quando ora corro:

py.test --ds=base.settings.settings 

ottengo l'errore:

ERROR: Could not import settings 'base.settings.settings' (Is it on sys.path?): No module named base.settings.settings.

lo stesso effetto quando non ho impostato il impostazioni tramite riga di comando, ma tramite il file pytest.ini (rimuovendo il commento dalla riga).

Sembra che mi manchi qualcosa qui ???

risposta

19

Perché django.conf.settings è pigro tenterà di importare il modulo impostazioni solo quando si tenta di accedere esso. Ecco perché il test non fallisce quando si importa semplicemente l'oggetto impostazioni.

Il tuo problema è già discusso qui: https://github.com/pelme/pytest_django/issues/23

questo è un problema con pytest e non con pytest-Django stesso. Pytest per qualche ragione rimuove la directory corrente da sys.path. Dovrebbe essere facile aggirarlo.

Soluzione 1:

PYTHONPATH=`pwd` py.test 

Soluzione 2:

aggiungere questo alla tua conftest.py (ho pensato che conftest.py si trova nella stessa directory le tue applicazioni sono):

import os 
import sys 

sys.path.append(os.path.dirname(__file__)) 

Soluzione 3 (se si utilizza wrapper virtualenv):

quando si avvia un nuovo progetto basta aggiungere directory principale del progetto di PYTHONPATH di virtualenv da l'esecuzione di questa linea nella directory del progetto:

add2virtualenv . 
+4

py.test non rimuove la directory corrente da sys.path, questo è il comportamento di python: quando si esegue uno script (py.test in questo caso) la directory dello script viene aggiunta a sys.path. Quando si esegue in modo interattivo, la directory di lavoro corrente viene aggiunta a sys.path. – flub

0

From the docs, sembra che base è già in vostro percorso - così forse si vuole essere utilizzando

py.test --ds=settings.settings 
+0

Appena provato, non cambia nulla – schacki

1

Perché ci sono 3 "t" s' nelle impostazioni? deve essere impostato in base ai settaggi

+1

Grazie per aver catturato il tipo. Ma sfortunatamente, questa non era la causa principale. – schacki

0

Si esegue il secondo programma senza l'argomento --ds=base.settings.settings e non il primo. È da qui che sembra provenire l'errore.

anche durante l'importazione di codice con lo stesso nome settings sarei tentato di fare qualcosa di simile:

from base.settings import settings as foo 
from django.conf import settings as bar 
+0

Ho inserito la tua seconda raccomandazione. Ma non capisco il tuo primo commento? – schacki

+0

nella domanda che dici "quando eseguo ora:' py.test' ", ma poi la seconda volta che dici" Quando eseguo ora: 'py.test --ds = base.settings.settings'". È un errore? In caso contrario, il flag ds potrebbe causare il tuo problema – Awalias

+0

No, questo non è un errore di battitura, ma esattamente voglio mostrarlo. Ho bisogno di specificare le mie impostazioni in qualche modo e per questo esempio, ho scelto il flag ds. E non appena ho impostato questo, ricevo il messaggio di errore. Nel primo esempio, voglio solo dimostrare che le mie impostazioni sono raggiungibili tramite il percorso Python. Quindi, da un lato, le mie impostazioni sono sul percorso Python. Ma d'altra parte, non appena li ho specificati, non possono essere trovati? – schacki

0

Ho avuto lo stesso problema. pytest -s <project_dir> funziona bene per me.