2010-04-12 16 views
12

Ich versuche, eine Testabdeckung für eine Django-CMS-Implementierung zu erhalten, an der ich arbeite, und ich bin mir nicht sicher, wie ich Plugins/Extensions testen kann. Hat jemand das schon mal gemacht, und wenn ja, wie? Einige Beispiele wären großartig.Wie testet man Django-CMS Erweiterungen?

+1

+1, ich bin auch daran interessiert. –

Antwort

2

Wenn ich Ihre Frage richtig verstanden habe, finden Sie Beispiele für Komponententests für Plugins im Modul cms/tests/plugins.py, das sich im Ordner Ihrer Installation von django-cms befindet.

Im Wesentlichen Sie Unterklasse CMSTestCase und verwenden Sie die Client-Klasse von django.test.client, um Anfragen an Ihren CMS und überprüfen Sie die resultierenden Antworten.

Informationen darüber, wie Sie den Client verwenden, können auf http://docs.djangoproject.com/en/dev/topics/testing/#module-django.test.client

4

Tests von cms/tests/plugins.py wie Tests gezeigt, ist eher die Integration als Unit-Tests gefunden werden, und das ist ziemlich schwergewichtige und erfordern einen manchmal zu großen Teil des gesamten Systems up and running (nicht notwendig falsch, nur unpraktisch beim Debuggen).

DjangoCMS fest integriert ist, so, was ich hier sind, haben ein paar Techniken ‚näher an das Metall‘ und nicht als eine vollständige Lösung zu erhalten:

Sie benötigen einen -Stil gefälschte Klasse ‚Expando‘:

class Expando(object): # Never use in production! 
    def __init__(self, **kw): 
     self.__dict__.update(kw) 

Um eine Instanz der Plugin-Klasse instanziiert:

from cms.plugin_pool import plugin_pool 

# ..in production code: class YourPlugin(CMSPlugin)... 

# This ensures that the system is aware of your plugin: 
YrPluginCls = plugin_pool.plugins.get('YourPlugin', None) 

# ..instantiate: 
plugin = YrPluginCls() 

Sanity die Plugins .render Methode überprüfen:

ctx = plugin.render({}, Expando(attr1='a1', attr2=123), None) 

mit tatsächlichen Vorlage übertragen, überprüft Ausgabe:

res = render_to_response(look.render_template, ctx) 
# assert that attr1 exist in res if it should 
# ..same for attr2 

BeautifulSoup praktisch ist, wenn der Inhalt des kleinen DOM-Fragments zu validieren.

Verwenden Admin-Formularfelder indirekt, dass die Modellattribute überprüfen korrekt verhalten:

from django.test.client import RequestFactory 
from django.contrib.auth.models import AnonymousUser 

# ... 

request = RequestFactory().get('/') 
request.user = AnonymousUser() 
a_field = plugin.get_form(request).base_fields['a_field'] 
a_field.validate('<some valid value>') 
# Check that a_field.validate('<some invalid value>') raises