2011-08-19 14 views
15

Usando el framework de pruebas (TestCase) de Django 1.3, me gustaría ejecutar algunas pruebas en archivos estáticos (es decir, archivos no necesariamente servidos por django en prod pero que pueden ser servidos para depuración (runserver)). Pero si me quedoDjango: probando archivos estáticos

... me sale un error 404 en mis pruebas. (por supuesto, este archivo está disponible en runserver)

¿Por qué no, pero cuál sería la mejor manera de comprobar la presencia de este esquema json en mis archivos estáticos? (En mi caso, también me gustaría probar este esquema JSON pública en contra de una salida JSON generado, por lo que desea que el contenido del archivo)

+5

Esto sucede porque [Django pruebas se ejecutan con 'debug = false' siempre, independientemente de la configuración] (https://docs.djangoproject.com/en/dev/topics/testing/#other-test-conditions). Sin embargo, no estoy seguro de lo que debes hacer, así que espera una respuesta real: s –

+1

Tuve un escenario en el que tuve que establecer 'settings.DEBUG = False'. Esto es posible por 'from django.test.utils import override_settings' y luego decorando la prueba con' @override_settings (DEBUG = True) '[documentación de django] (https://docs.djangoproject.com/en/1.4/topics/ testing/# overriding-settings) – DMfll

Respuesta

6

Otro método que me parece un poco más fácil ya que hay que escribir menos/importación:

from django.contrib.staticfiles import finders 

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

Si se encontró el archivo estático, devolverá la ruta completa al archivo. Si no lo encuentra, volverá None

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


A partir de Django 1.7+, también se puede averiguar/prueba en la que Django está mirando a través del módulo de buscadores:

searched_locations = finders.searched_locations 

Además de la afirmación SimpleTestCase.assertTemplateUsed(response, template_name, msg_prefix='') proporcionada por Django, también puede hacer uso de: response.templates de la clase de respuesta para obtener una lista de las plantillas que se usaron para representar la respuesta.

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

+0

Esto arroja una SuspiciousFileOperation en mi prueba para contenido cargado –

8

¿qué tal esto:

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) 

Este utiliza los buscadores staticfiles para encontrar un archivo llamado 'somefile.json' y luego verifica si el archivo realmente existe en el almacenamiento que configuró?

+0

No es tan transparente como esperaba, pero debería funcionar.Intentaré validar esto pronto. Thx – smad

2

Como comenta isbadawi, el servidor de prueba siempre se ejecuta con DEBUG = False. Por lo tanto, no puede confiar en el manejo de DEBUG de los archivos estáticos, necesita una forma explícita de manejo de la prueba para encontrarlos. Usted podría tener una sección especial en su urls.py que gira sobre el desarrollo serve() para cuando se ejecuta 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, 
     }), 
    ) 
Cuestiones relacionadas