2009-11-06 10 views
28

Estoy agregando un conjunto de etiquetas de plantilla a una aplicación de Django y no estoy seguro de cómo probarlas. Los he usado en mis plantillas y parecen estar funcionando, pero estaba buscando algo más formal. La lógica principal se realiza en los modelos/gestores de modelos y se ha probado. Las etiquetas simplemente recuperar los datos y lo almacenan en una variable de contexto como¿Cómo probar las etiquetas de plantilla personalizadas en Django?

{% views_for_object widget as views %} 
""" 
Retrieves the number of views and stores them in a context variable. 
""" 
# or 
{% most_viewed_for_model main.model_name as viewed_models %} 
""" 
Retrieves the ViewTrackers for the most viewed instances of the given model. 
""" 

Así que mi pregunta es qué normalmente probar sus etiquetas de plantilla y si lo hace, ¿cómo lo haces?

Respuesta

30

Se trata de un breve pasaje de una de mis archivos de prueba, donde self.render_template un método de ayuda simple en el TestCase es:

rendered = self.render_template(
     '{% load templatequery %}' 
     '{% displayquery django_templatequery.KeyValue all() with "list.html" %}' 
    ) 
    self.assertEqual(rendered,"foo=0\nbar=50\nspam=100\negg=200\n") 

    self.assertRaises(
     template.TemplateSyntaxError, 
     self.render_template, 
     '{% load templatequery %}' 
     '{% displayquery django_templatequery.KeyValue all() notwith "list.html" %}' 
    ) 

Es muy básico y utiliza pruebas de blackbox. Simplemente toma una cadena como fuente de plantilla, la renderiza y verifica si el resultado es igual a la cadena esperada.

El método render_template es bastante simple:

from django.template import Context, Template 

class MyTest(TestCase): 
    def render_template(self, string, context=None): 
     context = context or {} 
     context = Context(context) 
     return Template(string).render(context) 
+0

¿Cómo se prueba esto fuera del alcance de un proyecto, por ejemplo, para una aplicación reutilizable? La representación de una cadena de plantilla que incluya '{% load custom_tag%}' no parece funcionar, al menos sin trabajo adicional? – Santa

+2

Respondí mi propia pregunta: use 'register = template.Library(); template.libraries ['django.templatetags.mytest'] = registrar; register.tag (name = 'custom_tag', compile_function = custom_tag) '. – Santa

+2

¿Qué es 'self' en tu código de muestra? El objeto 'My TestCase' no tiene el método' render_template' –

0

Las cadenas se pueden representar como plantillas, por lo que podría escribir una prueba que incluya una simple 'plantilla' utilizando la etiqueta de plantilla como una cadena y simplemente asegurarse de que se renderice correctamente dado un contexto determinado.

+0

Estas etiquetas sólo se hacen una cadena vacía y en lugar de cambiar el contexto, sino que debe ser capaz de probar para eso también. –

0

Cuando estaba probando las etiquetas de mi plantilla, la etiqueta, en sí misma, devuelve una cadena que contiene el texto o el dict con el que estaba trabajando ... más o menos de acuerdo con la otra sugerencia.

Dado que las etiquetas pueden modificar el contexto y/o devolver una cadena para representar, encontré que era más rápido solo para ver la cadena procesada.

En lugar de:

return '' 

tienen:

return str(my_data_that_I_am_testing) 

hasta que esté satisfecho.

17

Ustedes me pusieron en el camino correcto. Es posible comprobar que el contexto ha cambiado correctamente después de la imagen:

class TemplateTagsTestCase(unittest.TestCase):   
    def setUp(self):  
     self.obj = TestObject.objects.create(title='Obj a') 

    def testViewsForOjbect(self): 
     ViewTracker.add_view_for(self.obj) 
     t = Template('{% load my_tags %}{% views_for_object obj as views %}') 
     c = Context({"obj": self.obj}) 
     t.render(c) 
     self.assertEqual(c['views'], 1) 
Cuestiones relacionadas