2011-08-19 27 views
15

Utilizzando il framework di test (TestCase) di Django 1.3, vorrei eseguire alcuni test su file statici (cioè, file non necessariamente serviti da django stesso su prod ma che possono essere serviti per debug (runserver)). Ma se corroDjango: test di file statici

... ottengo un errore 404 nel mio test. (ovviamente, questo file è disponibile su runserver)

Perché no, ma quale sarebbe il modo più bello per verificare la presenza di questo schema json nei miei file statici? (Nel mio caso, vorrei anche mettere alla prova questo schema JSON pubblica contro un'uscita JSON generato, quindi voglio il contenuto del file)

+5

Questo accade perché [Django test eseguiti con 'DEBUG = FALSE sempre, a prescindere dalle impostazioni] (https://docs.djangoproject.com/en/dev/topics/testing/#other-test-conditions). Non sono sicuro di cosa dovresti fare, quindi aspetta una risposta reale: s –

+1

Avevo uno scenario in cui dovevo impostare 'settings.DEBUG = False'. Ciò è possibile con 'from django.test.utils import override_settings' e quindi decorando il test con' @override_settings (DEBUG = True) '[documentazione di django] (https://docs.djangoproject.com/en/1.4/topics/ testing/# overriding-settings) – DMfll

risposta

6

Un altro metodo che trovo un po 'più facile in quanto c'è meno da digitare/importazione:

from django.contrib.staticfiles import finders 

result = finders.find('css/base.css') 

Se il file statico è stato trovato, restituirà il percorso completo del file. Se non viene trovato, verrà restituito None

Fonte: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#finders-module


Come di Django 1.7+, si può anche scoprire/prova in cui Django sta cercando attraverso il modulo cercatori:

searched_locations = finders.searched_locations 

Oltre all'asserzione SimpleTestCase.assertTemplateUsed(response, template_name, msg_prefix='') fornita da Django, è anche possibile utilizzare: response.templates dalla classe Response per ottenere un elenco di modelli che sono stati utilizzati per il rendering della risposta.

Fonte: https://docs.djangoproject.com/en/dev/topics/testing/tools/#django.test.Response.templates

+0

Questo genera un SuspiciousFileOperation nel mio test per il contenuto caricato –

8

come su questo:

from django.contrib.staticfiles import finders 
from django.contrib.staticfiles.storage import staticfiles_storage 

absolute_path = finders.find('somefile.json') 
assert staticfiles_storage.exists(absolute_path) 

Questo utilizza i staticfiles cercatori per trovare un file chiamato "somefile.json" e quindi controlla se il file esiste effettivamente nella memoria che hai configurato?

+0

Non è trasparente come speravo ma dovrebbe funzionare.Proverò a convalidarlo presto. Thx – smad

2

Come commenti isbadawi, il server di test viene eseguito sempre con DEBUG = False. Quindi non si può fare affidamento sulla gestione DEBUG dei file statici, è necessario un modo esplicito di produzione per gestirli affinché il test li trovi. Si potrebbe avere una sezione speciale nella vostra urls.py che accende lo sviluppo serve() per quando si esegue test:

if 'test' in sys.argv: 
    static_url = re.escape(settings.STATIC_URL.lstrip('/')) 
    urlpatterns += patterns('', 
     url(r'^%s(?P<path>.*)$' % static_url, 'django.views.static.serve', { 
      'document_root': settings.STATIC_ROOT, 
     }), 
    ) 
Problemi correlati