我正在尝试将Mock与Django一起使用有两件事:1.获取一个用户(我们有一个自定义后端,可以进行我要避免的网络调用)2.模拟出另一种获取令牌的方法,该令牌用于通过网络重置密码。
这是测试:
@patch('core.views.KagisoUser')
def test_forgot_password_sends_reset_email(self, MockKagisoUser): # noqa
email = '[email protected]'
user = MagicMock()
user.email = email
user.generate_reset_password_token.return_value = email
MockKagisoUser.objects.first.return_value = user
data = {'email': email}
client = Client()
response = client.post('/forgot_password/', data, follow=True)
message = list(response.context['messages'])[0].message
assert response.status_code == 200
assert 'You will receive an email with reset instructions shortly' \
== message
assert len(mail.outbox) == 1
assert mail.outbox[0].to[0] == email
assert mail.outbox[0].subject == 'Password Reset'
assert mail.outbox[0].alternatives[0] # HTML body
我收到此错误:
self = <django.core.mail.message.EmailMultiAlternatives object at 0x7f52eacd3390>
def message(self):
encoding = self.encoding or settings.DEFAULT_CHARSET
msg = SafeMIMEText(self.body, self.content_subtype, encoding)
msg = self._create_message(msg)
msg['Subject'] = self.subject
msg['From'] = self.extra_headers.get('From', self.from_email)
> msg['To'] = self.extra_headers.get('To', ', '.join(self.to))
E TypeError: sequence item 0: expected str instance, MagicMock found
这是实现:
def forgot_password(request):
reset_message = 'You will receive an email with reset instructions shortly'
not_found_message = 'We could not find a user for that email address'
if request.method == 'POST':
form = forms.ForgotPasswordForm(request.POST)
if form.is_valid():
email = form.cleaned_data['email']
user = KagisoUser.objects.filter(email=email).first()
if user:
print(user.email)
token = user.generate_reset_password_token()
url = request.build_absolute_uri(reverse('reset_password'))
message = render_to_string(
'core/emails/reset_password.html',
{
'url': url,
'token': token,
'user_id': user.id
}
)
send_mail(
'Password Reset',
'',
'[email protected]',
[user.email],
html_message=message
)
messages.success(request, reset_message)
return HttpResponseRedirect('/')
else:
messages.error(request, not_found_message)
return HttpResponseRedirect(reverse('forgot_password'))
else:
form = forms.ForgotPasswordForm()
return render(
request,
'core/auth/forgot_password.html',
{'form': form}
)
我究竟做错了什么?
堆栈跟踪将非常有用...
但除此之外,您似乎在嘲笑,MockKagisoUser.objects.first
而您的视图却吸引了用户,KagisoUser.objects.filter(email=email).first()
因此您丢失了filter
mock_filter = MagicMock()
mock_filter.first.return_value = user
MockKagisoUser.objects.filter.return_value = mock_filter
上面的代码应该为您返回一个过滤器,该过滤器将在获取时返回您的用户,而first
该过滤器又将返回您在视图中的用户,而不是返回MagicMock实例
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句