我想测试提交后是否将消息发送给用户。我正在使用django.contrib.messages。一切似乎都在手动测试(runserver)期间工作,但在单元测试中我没有得到消息。
存储消息的代码:
messages.success(request, _('Internationalized evil message.'))
应该测试消息的代码:
from django.contrib.messages.api import get_messages
...
def test_message_should_sent_to_user(self):
"""After successful phone number submit, message should be displayed."""
response = self.client.post(
reverse('evil.views.evil_data_submit'), self.valid_data)
messages = get_messages(response.request)
self.assertNotEqual(len(messages), 0)
看起来在测试客户端post方法调用期间没有调用中间件。
@Tisho answer
后更新消息应该在response.context
中找到,即使我的胆量说它应该有用,但事实并非如此。我已将import pdb; pdb.set_trace()
放在django / contrib / messages / context_processors.py中,以查看它是否在测试client.post
期间被调用,而不是。{/ p>
我已经仔细检查过TEMPLATE_CONTEXT_PROCESSORS
,MIDDLEWARE_CLASSES
和INSTALLED_APPS
- 可能明天我会发现我错过了一些东西。
重要细节
忘记提及如果提交成功,则返回 HttpResponseRedirect ,因此response.context
为空。
解决方案
View返回redirect(没有上下文数据),以解决我们可以将follow=True
传递给client.post方法(@Tisho建议的方法)。
答案 0 :(得分:3)
在单元测试期间,可以在
中找到该消息response = self.client.post(
reverse('evil.views.evil_data_submit'), self.valid_data)
messages = response.context['messages']
如果您的视图返回重定向,response.context
将为空,除非您通过follow=True
,如下所示:
response = self.client.post(
reverse('evil.views.evil_data_submit'),
self.valid_data,
follow=True)
答案 1 :(得分:2)
我找到的最好的方法是使用mock
http://www.voidspace.org.uk/python/mock/patch.html#patch-methods-start-and-stop
class SimpleCommentTestDirect(TestCase):
def setUp(self):
self._patcher1 = patch('django.contrib.messages.error')
self.mock_error = self._patcher1.start()
def tearDown(self):
self._patcher1.stop()
def test_error_message(self):
self.client.get('/vote/direct/unknownapp/comment/1/up/')
self.assertEqual(self.mock_error.call_args[0][1], 'Wrong request. Model.')
BTW:还应该有一种通过使用mock获取请求的方法。并通过使用来自django.contrib.messages.get_messages 的请求对象获取消息