Django Testing -检查消息中是否有重定向的视图

v440hwme  于 2022-11-18  发布在  Go
关注(0)|答案(5)|浏览(100)

我一直在为我的一个django应用程序编写测试,并一直在寻找解决这个问题的方法。我有一个视图,它在不同的情况下使用django.contrib.messages发送消息。

from django.contrib import messages
from django.shortcuts import redirect

import custom_messages

def some_view(request):
    """ This is a sample view for testing purposes.
    """

    some_condition = models.SomeModel.objects.get_or_none(
        condition=some_condition)
    if some_condition:
        messages.success(request, custom_message.SUCCESS)
    else:
        messages.error(request, custom_message.ERROR)
    redirect(some_other_view)

现在,在测试这个视图client.get的响应时,它不包含context字典,而context字典中包含了messages,因为这个视图使用了重定向。对于呈现模板的视图,我们可以使用messages = response.context.get('messages')访问消息列表。我们如何才能访问重定向视图的messages呢?

rqenqsqc

rqenqsqc1#

client.get() 调用 中 使用 follow=True 选项 , 客户 端 将 跟随 重 定向 。 然后 , 您 可以 测试 消息 是否 位于 重 定向 到 的 视图 的 上下 文 中 。

def test_some_view(self):
    # use follow=True to follow redirect
    response = self.client.get('/some-url/', follow=True)

    # don't really need to check status code because assertRedirects will check it
    self.assertEqual(response.status_code, 200)
    self.assertRedirects(response, '/some-other-url/')

    # get message from context and check that expected text is there
    message = list(response.context.get('messages'))[0]
    self.assertEqual(message.tags, "success")
    self.assertTrue("success text" in message.message)

中 的 每 一 个

9rnv2umw

9rnv2umw2#

你可以使用get_messages()和response.wsgi_request,如下所示(在Django 1.10中测试过):

from django.contrib.messages import get_messages  
...
def test_view(self):
    response = self.client.get('/some-url/') # you don't need follow=True
    self.assertRedirects(response, '/some-other-url/')
    # each element is an instance of  django.contrib.messages.storage.base.Message
    all_messages = [msg for msg in get_messages(response.wsgi_request)]

    # here's how you test the first message
    self.assertEqual(all_messages[0].tags, "success")
    self.assertEqual(all_messages[0].message, "you have done well")
toiithl6

toiithl63#

如果您的视图是重定向的,并且您在对测试客户端的请求中使用了follow=true,那么上面的方法就不起作用了。

@classmethod
def getmessage(cls, response):
    """Helper method to return message from response """
    for c in response.context:
        message = [m for m in c.get('messages')][0]
        if message:
            return message

您可以将它包含在测试类中,并按如下方式使用它:

message = self.getmessage(response)

其中response是从getpost返回到Client的值。
这是一个有点脆弱,但希望它节省别人一些时间。

eh57zj3b

eh57zj3b4#

我在使用第三方应用程序时也遇到了同样的问题。
如果您希望从另一个视图中返回HttpResponseRedict(您无法从该视图访问上下文)的视图中获取消息,则可以使用get_messages(request)

from django.contrib.messages import get_messages  

storage = get_messages(request)  
for message in storage:  
    do_something_with_the_message(message)

不过,这会清除消息存储,因此如果您以后要访问模板中的消息,请添加:

storage.used = False
kwvwclae

kwvwclae5#

模拟消息的替代方法(不需要遵循重定向):

from mock import ANY, patch
from django.contrib import messages

@patch('myapp.views.messages.add_message')
def test_some_view(self, mock_add_message):
    r = self.client.get('/some-url/')
    mock_add_message.assert_called_once_with(ANY, messages.ERROR, 'Expected message.')  # or assert_called_with, assert_has_calls...

相关问题