2013-07-24 15 views
5

Ho iniziato a utilizzare un processore di contesto personalizzato per passare un oggetto a ogni risposta. L'unico problema con questo è che i miei test ora falliscono perché non riescono a trovare questo oggetto nel database. Ho provato a creare un test con Request Factory, poiché comprendevo che questo isolava i test di Django come il middleware, ecc. Suppongo che i processori di contesto siano ancora in esecuzione. C'è un modo per superare questo? Dovrò passare questo oggetto ad ogni test? Se c'è un modo per evitarlo, preferirei farlo.Processori contesto personalizzati, unit test e factory richiesta

risposta

1

Dopo ulteriori indagini, ritengo che la soluzione migliore sia quella di sovrascrivere la tupla context_processors durante ciascun test. Questo è stato possibile dal 1.4. Sembra meglio che inviare l'oggetto richiesto ad ogni test. Mi piacerebbe indagare se posso scrivere un decoratore personalizzato per questo, ma non ne so ancora abbastanza su di loro. Riferimento: https://docs.djangoproject.com/en/dev/topics/testing/overview/#overriding-settings

edit: Un'altra implementazione di questa soluzione qui delineato: How to Unit test with different settings in Django? probabilmente meglio in quanto può essere fatto per un intero tests.py

EDIT2: avendo scoperto che decoratori sono in realtà costrutti Python (presume fossero personalizzato funzionalità django! massiccia newbie a python, a proposito, ho imparato il django prima di imparare qualsiasi python), penso che un decoratore personalizzato sia il modo in cui andrò con questo.

edit3: Penso che in realtà una soluzione più semplice sarebbe avere un file test.py nel mio modulo delle impostazioni e sovrascrivere il mio modulo context_processor delle impostazioni di base con quello delle impostazioni di test nei test. Ad es .:

from settings import localsettings 
from settings import testsetttings 

localtestsettings.context_processors = testsettings.context_processors 

tests(unittest):..... 

Qualsiasi altro suggerimento è più che benvenuto.

edit4: Ok. Mi sento stupido ora. Ovviamente la soluzione che ho finito per usare è creare un file di impostazioni di test e passarlo al comando di test.

1

Utilizzare questo su tests.py ha funzionato bene con me

from django.test import TestCase, Client, override_settings 

@override_settings (
    TEMPLATES = [ 
    { 
    'BACKEND': 'django.template.backends.django.DjangoTemplates', 
    'DIRS': [], 
    'APP_DIRS': True, 
    'OPTIONS': { 
     'context_processors': [ 
      'django.template.context_processors.debug', 
      'django.template.context_processors.request', 
      'django.contrib.auth.context_processors.auth', 
      'django.contrib.messages.context_processors.messages', 
     ], 
    }, 
    }, 
    ] 
) 

class HomeViewTestCase(TestCase): 
    ...