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.
Antworten
Zu viele Anzeigen?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
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