15 Stimmen

Wie testet man Django-CMS-Erweiterungen?

Ich versuche, einige Testabdeckung für eine Django-CMS-Implementierung zu erhalten, an der ich arbeite, und ich bin unsicher, wie zu Unit-Test-Plugins/Erweiterungen. Hat jemand das schon mal gemacht, und wenn ja, wie? Einige Beispiele wären großartig.

6voto

Jacob Oscarson Punkte 6198

Tests, wie sie von cms/tests/plugins.py sind eher Integrationstests als Unit-Tests, und das ist ziemlich schwerfällig und erfordert manchmal einen zu großen Teil des gesamten Systems (nicht unbedingt falsch, nur unpraktisch beim Debuggen).

DjangoCMS ist eng integriert, so dass ich hier ein paar Techniken, um "näher an das Metall" und nicht eine komplette Lösung:

Sie brauchen eine 'Expando'-ähnliche Fake-Klasse:

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

So instanziieren Sie eine Instanz Ihrer Plugin-Klasse:

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()

Überprüfung der Plugins auf Fehlerfreiheit .render Methode:

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

Mit aktueller Vorlage rendern, Ausgabe prüfen:

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

BeautifulSoup ist praktisch, wenn der Inhalt kleiner DOM-Fragmente validiert werden soll.

Verwenden Sie Admin-Formularfelder, um indirekt zu prüfen, ob sich Modellattribute 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

3voto

tcmb Punkte 279

Wenn ich Ihre Frage richtig verstehe, finden Sie Beispiele für Unit-Tests für Plugins im Modul cms/tests/plugins.py, das sich in dem Ordner befindet, in dem Ihre Installation von django-cms liegt.

Im Grunde genommen unterklassifizieren Sie CMSTestCase und verwenden die Client-Klasse aus django.test.client, um Anfragen an Ihr CMS zu stellen und die resultierenden Antworten zu überprüfen.

Informationen über die Verwendung des Clients finden Sie unter http://docs.djangoproject.com/en/dev/topics/testing/#module-django.test.client

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X