Testowanie widoków

Zadania widoku:

  • gromadzi dane do renderowania przy użyciu metod menedżera
  • inicjowanie formularzy
  • renderowanie szablonów

W widokach nie powinieneś:

  • sprawdzanie poprawności danych - za to jest odpowiedzialność formularz
  • zapisywać danych - to jest odpowiezialność formularza
  • budowanie złożonych zapytań - to jest odpowiedzialność menedżera

Jak testować:

  • Testując widoki wykorzystuj RequestFactory
  • jeśli możesz wykonuj bezpośrednie wywołanie widoku
  • Konfiguruj zależności w sposób jawny (np. request.user, request.session)

Podstawy

from django.contrib.auth.models import User
from django.http import HttpResponseRedirect
from django.views.generic import TemplateView

from .forms import AddTaskForm


class AddTaskView(TemplateView):

    template_name = 'tasks/index.html'
    form_class = AddTaskForm
    users_manager = User.objects

    def get(self, request, *args, **kwargs):
        author = request.user
        owner = self._get_owner()
        form = self.form_class(author=author, owner=owner)
        context = {
            'form': form,
            'owner': owner,
            'author': author,
        }
        return self.render_to_response(context)

    def post(self, request, *args, **kwargs):
        author = request.user
        owner = self._get_owner()
        form = self.form_class(request.POST, author=author, owner=owner)
        if form.is_valid():
            obj = form.save()
            return HttpResponseRedirect(obj.get_absolute_url())
        context = {
            'form': form,
            'owner': owner,
            'author': author,
        }
        return self.render_to_response(context)

    def _get_owner(self):
        try:
            profile_login = self.kwargs['profile']
        except KeyError:
            owner = self.request.user
        else:
            owner = self.users_manager.get(username=profile_login)
        return owner
class TestView:

    def setUp(self):
        self._form_class = Mock(AddTaskForm)
        self._users_manager = Mock(User.objects)
        self._view = AddTaskView.as_view(
            form_class=self._form_class,
            users_manager=self._users_manager)

    def test_should_display_task_creation_form(self):
        url = reverse('my_tasks')
        request = self._factory.get(url)
        request.user = Mock(User)

        response = self._view(request)

        self.assertTrue('form' in response.context_data)

    def test_should_save_form_and_redirect_on_success(self):
        url = reverse('my_tasks')
        form = self._form_class.return_value
        form.is_valid.return_value = True
        redirect_url = '/some/url'
        obj = form.save.return_value
        obj.get_absolute_url.return_value = redirect_url
        data = {
            'title': sentinel.title,
        }
        request = self._factory.post(url, data)
        request.user = Mock(User)

        response = self._view(request)

        self.assertTrue(form.save.called)
        self.assertTrue(obj.get_absolute_url.called)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], redirect_url)

request = RequestFactory().get(«/fake-path») view = HelloView.as_view(template_name=»hello.html») response = view(request, name=»bob»)