Я искал простое решение для той же проблемы сегодня и нашел это действительно замечательное сообщение в блоге от Бенуа Брайона (спасибо!).
Он предложил следующую функцию:
def setup_view(view, request, *args, **kwargs):
"""Mimic as_view() returned callable, but returns view instance.
args and kwargs are the same you would pass to ``reverse()``
"""
view.request = request
view.args = args
view.kwargs = kwargs
return view
Пример
Я хотел проверить следующее CBV:
class CreateList(CreateView):
model = Item
form_class = NewListForm
template_name = 'lists/home_page.html'
def form_valid(self, form):
list_ = form.save(owner=self.request.user)
return redirect(list_)
Необходимые тесты для аргументов метода form.save
и для аргументов redirect
, которые должны быть возвращаемым значением первого. Эти тесты будут выглядеть примерно так:
class CreateListTest(unittest.TestCase):
def setUp(self):
self.request = HttpRequest()
self.request.user = Mock()
self.form = Mock()
self.view = setup_view(views.CreateList(), self.request)
def test_form_dot_save_called_with_user(self):
self.view.form_valid(self.form)
self.form.save.assert_called_once_with(owner=self.request.user)
@patch('lists.views.redirect')
def test_redirect(self, mock_redirect):
self.view.form_valid(self.form)
mock_redirect.assert_called_once_with(self.form.save.return_value)