Тестирование сообщений при использовании 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])