Почему мой тест Django не проходит, когда представление действительно работает? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть представление на основе классов, которое работает в браузере так, как задумано. Я пытаюсь написать модульные тесты для представления, но они не работают. Интересно почему. Представление (UserPassesTest показывает, является ли пользователь суперпользователем или нет):

class EditUserView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
    """handles get and post for adding a new AEUser"""
    template_name = 'editUser.html'
    title = 'Edit User'

    def get(self, request, *args, **kwargs):
        """handles the GET"""
        post_url = reverse('edit_user', args=[kwargs['user_id']])
        usr = get_object_or_404(AEUser, pk=kwargs['user_id'])
        form = EditUserForm(initial={'is_active':usr.is_active, 'is_superuser':usr.is_superuser}, \
            user=usr, request=request)
        return render(request, self.template_name, \
            {'title_text':self.title, 'post_url':post_url, 'form':form})

Тестовый пример:

class TestEditUser(TestCase):
    """test the AddUser view"""

    @classmethod
    def setUpTestData(cls):
        cls.user = AEUser.objects.create_user(username='shawn', email='shawn@gmail.com', password='test')
        cls.user.is_superuser = True
        cls.user.save()

    def setUp(self):
        self.client = Client()

    def test_get(self):
        """tests the GET"""
        self.client.login(username=self.user.username, password=self.user.password)
        get_url = reverse('edit_user', args=[self.user.id])
        response = self.client.get(get_url, follow=True)
        self.assertEqual(self.user.is_superuser, True)
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'editUser.html')

У меня есть 3 утверждения в тестовом примере. Если я закомментирую последние два и только утверждаю, что пользователь является суперпользователем, тест проходит. Однако по какой-то причине по двум другим утверждениям я получаю неудачи. Я получаю следующую ошибку:

AssertionError: False is not true : Template 'editUser.html' was not a template used to render the response. Actual template(s) used: 404.html, base.html, что наводит меня на мысль, что вызов get_object_or_404 - это то, что вызывает сбой. Где я ошибаюсь с этим тестовым примером? Спасибо!

1 Ответ

0 голосов
/ 28 мая 2020

Тест должен быть:

class TestEditUser(TestCase):
    """test the AddUser view"""

    @classmethod
    def setUpTestData(cls):
        cls.user = AEUser.objects.create_user(username='shawn', email='shawn@gmail.com', password='test')
        cls.user.is_superuser = True
        cls.user.save()

    def setUp(self):
        self.client = Client()

    def test_get(self):
        """tests the GET"""
        self.client.login(username=self.user.username, password='test')
        get_url = reverse('edit_user', args=[self.user.id])
        response = self.client.get(get_url, follow=True)
        self.assertEqual(self.user.is_superuser, True)
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'editUser.html')
...