Тестирование метода класса с сессиями с помощью Mock в Django
Я новичок в тестировании Django и постепенно осваиваю Client() и запросы на основе RequestFactory, но я в полном тупике, как правильно протестировать следующий код.
(login is required through the OTPRequiredMixin)
class EmailVerificationCode(OTPRequiredMixin, FormView):
def time_diff():
# A simplification for the purpose of my question
return True
def check_code(self):
try:
if self.time_diff():
if str(self.user_code) == str(self.code):
user_record = User.objects.get(pk=self.request.user.pk)
user_record.is_user_verified = True
user_record.save()
messages.success(self.request,
_('Your email has been verified - thank you'
))
return redirect(reverse('account:user_profile'))
else:
messages.error(self.request, mark_safe(_(
'Sorry, but your code did not match.'
)))
return redirect(reverse('account:verify_email_code'))
else:
messages.info(self.request,
mark_safe(_('Sorry, but your code has expired.<br>'
)))
return redirect(reverse('account:verify_email'))
except (AttributeError, ObjectDoesNotExist):
messages.warning(self.request,
mark_safe(_('We are very sorry, but something went wrong.
'Please try to login again'
)))
return redirect(reverse('two_factor:login'))
Вот что я пробовал до сих пор:
Я успешно поиздевался над тем, что "if time_diff()" возвращает False, вместе с возможностью тестирования перестановок пользовательского_кода/кода, используя что-то вроде:
self.view = EmailVerificationCode()
self.view.time_diff = Mock(return_value=False)
self.view.user_code = '0000000000'
self.view.code = '0000000000'
self.view.check_code()
В этом месте я достиг уровня своей "некомпетентности", поскольку я не могу разработать, как проверить:
user_record = User.objects.get(pk=self.request.user.pk)
Этот тест требует, чтобы я подражал переменной сессии для удовлетворения 'request.user.pk', а также подражал части 'User' в user_record.
Я пытался использовать Client() и RequestFactory(), но они вносят дополнительные сложности, так как в игру вступают другие методы класса (не показанные в моем примере), что еще больше запутывает дело (вход пользователя и т.д.) Мое ощущение, что этот метод лучше тестировать отдельно, а не как часть "целого" класса.
Итак, мои вопросы следующие:
- Как передать 'request.user.pk' через mock (сессию?)?
- Как мне подружить сторону 'User' запроса user_record?
- Есть ли лучший способ сделать это?
Заранее спасибо.