Тестирование сообщений при использовании RequestFactory()

Я тестирую представление на основе класса, используя mock для создания исключения. При возникновении исключения должно быть создано сообщение, а затем выполнено перенаправление. В то время как я могу проверить, что перенаправление было выполнено, я пока не могу получить сообщение, чтобы проверить его.

view

CustomUser = get_user_model()

class SignUpView(FormView):
    template_name = 'accounts/signup.html'
    form_class = SignUpForm

    def form_valid(self, form):

        try:
            self.user = CustomUser.objects.filter(email=form.cleaned_data['email']).first()

            if not self.user:

                self.user = CustomUser.objects.create_user(email=form.cleaned_data['email'],
                                                           full_name=form.cleaned_data['full_name'],
                                                           password=form.cleaned_data['password'],
                                                           is_verified=False
                                                           )
            else:
                if self.user.is_verified:

                    self.send_reminder()

                    return super().form_valid(form)

            self.send_code()
        except:
            messages.error(self.request, _('Something went wrong, please try to register again'))
            return redirect(reverse('accounts:signup'))

        return super().form_valid(form)

Мой тест на данный момент:

class SignUpViewTest(TestCase):

    def setUp(self):
        self.factory = RequestFactory()

    def test_database_fail(self):
        with patch.object(CustomUserManager, 'create_user') as mock_method:
            mock_method.side_effect = Exception(ValueError)

            view = SignUpView.as_view()
            url = reverse('accounts:signup')
            data = {'email': 'test@test.com', 'full_name': 'Test Tester', 'password': 'Abnm1234'}
            request = self.factory.post(url, data)
            setattr(request, 'session', 'session')
            messages = FallbackStorage(request)
            request._messages = messages

            response = view(request)

            self.assertEqual(response.status_code, 302)
            self.assertEqual(response.url, '/accounts/signup/')
           

Мой вопрос в том, как мне получить сообщение, чтобы я мог сделать assertEqual против сообщения: 'Something went wrong, please try to register again'?

Покопавшись немного глубже, сообщение(я) можно найти здесь:

request._messages._queued_messages[0]

Поэтому assertEqual будет:

self.assertEqual(str(request._messages._queued_messages[0]), 'Something went wrong, please try to register again')

Покопавшись немного глубже, сообщение (сообщения) можно найти здесь: request._messages._queued_messages[0] И поэтому assertEqual будет: self.assertEqual(str(request._messages._queued_messages[0]), 'Something went wrong, please try to register again')

Это показалось мне немного халтурным, и после нескольких часов исследований я нашел чуть более надежный способ проверки пользовательских сообщений, генерируемых представлением (nb сообщений, наличие некоторой строки в последнем сгенерированном/единственном сообщении, наличие определенных строк в каждом сгенерированном сообщении):

from django.contrib.messages import get_messages

self.assertEqual(len(get_messages(request)), expected_nb_messages)


user_messages_sent = [str(i) for i in get_messages(request)] 
# the resulting BaseStorage class has an iterator method
# string conversion is needed to access to the actual text of the Message object 
           
if type(text_to_test_in_message)==dict:
   for k,v in text_to_test_in_message.items():
       self.assertIn(v, user_messages_sent[k])
   else:
       self.assertIn(text_to_test_in_message, user_messages_sent[-1])
Вернуться на верх