2014-10-27 2 views
2

Я просто ищу, чтобы написать модульный тест, который проверяет методы в моей ловкости SchemaForm, которые используют buttonAndHandler, но мне не удалось найти что-либо подходящее в документации z3c.form ни Руководство разработчика Ловкости. Я верю, что я споткнулся о поведении декоратора, но я не знаю, как я должен программно называть эти методы.unit testing buttonAndHandler с z3c.form

form = self.rf.restrictedTraverse('add-file') 
#mform = getMultiAdapter((self.rf,self.request), name='add-file') 

Использование метода ограничения Трейвера или getMultiAdapter дает один и тот же объект. Поэтому, если я хочу вызвать form.addFileSendToEditors, я передаю форму как первую переменную и что для «действия»?

ответ

3

В принципе, вы можете получить обработчики из формы и вызвать вручную.

Это пример с обычной формой z3c.form и формой для ловкости.

>>> form_view = self.rf.restrictedTraverse('add-file') 

# If your form is a Dexterity DefaultAddForm view. 
>>> form_view 
<plone.dexterity.browser.add.DefaultAddView object at 0x10cbf0950> 
# Get the form from the instance 
>>> form_view.form 
<class 'plone.dexterity.browser.add.DefaultAddForm'> 


# Than you can get all handlers 
>>> form_view.form.handlers 
<Handlers [<Handler for <Button 'save' u'Save'>>, <Handler for <Button 'cancel' u'Cancel'>>] 
# and all buttons 
form_view.form.buttons.items() 
[('save', <Button 'save' u'Save'>), ('cancel', <Button 'cancel' u'Cancel'>)] 

# In _handlers you can see the buttons, with the corresponding handlers 
form_view.form.handlers._handlers 
((<Button 'save' u'Save'>, <Handler for <Button 'save' u'Save'>>), (<Button 'cancel' u'Cancel'>, Handler for <Button 'cancel' u'Cancel'>>)) 

# You can also get the handler by button 
>>> save_button = form_view.form.buttons.items()[0] 
>>> save_handler = form_view.form.handlers.getHandler(save_button) 
<Handler for <Button 'save' u'Save'>> 

# Once you have your handler, you can call it directly 
save_handler.func(form_view.form_instance, save_button) 

Это зависит от того, что вы делаете, если вам нужно настроить немного больше, чтобы ваша тестовая работа. Вы не дали нам достаточной информации о том, что вы делаете в своем обработчике.

Это взято из документации z3c.form: Я не запускал этот код для себя.

# You can test your actions also this, probably more readable :-) 
from z3c.form.testing import TestRequest 
from z3c.form import button 

>>> request = TestRequest(form={'form.buttons.save': 'Save'}) 
>>> actions = button.ButtonActions(form_view.form_instance, request, None) 
>>> actions.update() 
>>> actions.execute() 
# This executes your Save actions. 
+0

Это именно то, что я искал, но документация z3c.form, с которой вы связались, на самом деле может быть более уместной. Очень хороший ответ, спасибо – Esoth