2015-11-11 1 views
2

Мне нужно проверить методы и вспомогательную функцию внутри класса класса на основе класса django.Как модульные методы тестирования внутри классов, основанных на классе django?

Рассмотрим этот класс, основанный Вид:

class MyClassBasedView(View): 

    def dispatch(self, request, *args, **kwargs): 
     .... 

    def __get_render_dict(): 
     d = {} 
     ... 
     return d 

    def my_method(self): 
     render_dict = self.__get_render_dict() 
     return render_response(self.request, 'template.html', render_dict) 

Для того, чтобы написать тесты для моей точки зрения, мне нужно, чтобы вызвать методы внутри, говорят __get_render_dict() непосредственно. Как я могу это достичь?

Я попытался

v = MyClassedBasedView() 
v.dispatch(request,args, kwargs) 
v.__method_name() 

, но это не удается с не соответствующими параметрами в пост/получить метод, даже если я звоню метод direclty без использования URL.

+1

Что вы имеете в виду методы внутри ' __get_render_dict'? –

+3

и гм ... почему вы создаете CBV напрямую (и отправляете)? Django делает это для вас, просто вставьте представление в 'urls.py' как' url (r'whateverpattern $ ', MyClassBasedView.as_view(), name =' viewname '), ' – Pynchia

+0

А также, пожалуйста, правильно отформатируйте свой код чтобы мы все понимали одно и то же. – Wtower

ответ

6

Чтобы использовать классные представления в ваших unittests, попробуйте setup_view от here.

def setup_view(view, request, *args, **kwargs): 
    """Mimic ``as_view()``, but returns view instance. 
    Use this function to get view instances on which you can run unit tests, 
    by testing specific methods.""" 

    view.request = request 
    view.args = args 
    view.kwargs = kwargs 
    return view 

Вам все еще нужно кормить его запрос, вы можете сделать это с django.test.RequestFactory:

factory = RequestFactory() 
    request = factory.get('/customer/details') 

Вы можете затем UnitTest ваши методы:

v = setup_view(MyClassedBasedView(), request) 
v.method_name() 
+0

Да, я использовал это для модульного теста. однако я хочу вызвать конкретную вспомогательную функцию, которая не привязана к какому-либо URL-адресу: например, '/ customer/details' вызывает func1, какой вызывающий помощник 1. как я вызываю helper1? – totoro

+0

'setup_view' возвращает объект вида. Затем вы можете вызывать 'Myview.helper (* args)', даже если он не вызывается переданным URL. 'setup_view' не вызывает' dispatch'. –

+0

спасибо за обновление! Могу ли я по-прежнему называть 'dispatch'? потому что он добавляет некоторые переменные, то есть 'self.foo', которые будут использоваться всеми другими методами. – totoro