首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何对django消息进行单元测试?

如何对django消息进行单元测试?
EN

Stack Overflow用户
提问于 2010-05-24 22:15:05
回答 4查看 20.6K关注 0票数 85

在我的django应用程序中,我尝试编写一个单元测试来执行操作,然后检查响应中的消息。

据我所知,没有好的方法可以做到这一点。

我使用的是CookieStorage存储方法,我想做一些类似于下面的事情:

代码语言:javascript
复制
    response = self.client.post('/do-something/', follow=True)
    self.assertEquals(response.context['messages'][0], "fail.")

问题是,我得到的只是一个

代码语言:javascript
复制
print response.context['messages']
<django.contrib.messages.storage.cookie.CookieStorage object at 0x3c55250>

我怎么才能把它变成有用的东西,或者我做错了什么?

谢谢,丹尼尔

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-16 19:26:03

我发现了一个非常简单的方法:

代码语言:javascript
复制
response = self.client.post('/foo/')
messages = list(response.context['messages'])
self.assertEqual(len(messages), 1)
self.assertEqual(str(messages[0]), 'my message')

如果您需要检查没有上下文的响应上的消息,您可以使用以下方法:

代码语言:javascript
复制
from django.contrib.messages import get_messages
messages = list(get_messages(response.wsgi_request))
self.assertEqual(len(messages), 1)
self.assertEqual(str(messages[0]), 'my message')

后备存储不支持索引,但它是可迭代的。

票数 108
EN

Stack Overflow用户

发布于 2011-02-08 22:35:58

这对我有效(显示所有消息):

代码语言:javascript
复制
print [m.message for m in list(response.context['messages'])]

下面是我在一个测试类中继承自Django的TestCase的几个实用方法。如果您更喜欢将它们作为函数,请删除self参数,并将self.fail()的参数替换为raise

代码语言:javascript
复制
def assert_message_count(self, response, expect_num):
    """
    Asserts that exactly the given number of messages have been sent.
    """

    actual_num = len(response.context['messages'])
    if actual_num != expect_num:
        self.fail('Message count was %d, expected %d' %
            (actual_num, expect_num))

def assert_message_contains(self, response, text, level=None):
    """
    Asserts that there is exactly one message containing the given text.
    """

    messages = response.context['messages']

    matches = [m for m in messages if text in m.message]

    if len(matches) == 1:
        msg = matches[0]
        if level is not None and msg.level != level:
            self.fail('There was one matching message but with different'
                'level: %s != %s' % (msg.level, level))

        return

    elif len(matches) == 0:
        messages_str = ", ".join('"%s"' % m for m in messages)
        self.fail('No message contained text "%s", messages were: %s' %
            (text, messages_str))
    else:
        self.fail('Multiple messages contained text "%s": %s' %
            (text, ", ".join(('"%s"' % m) for m in matches)))

def assert_message_not_contains(self, response, text):
    """ Assert that no message contains the given text. """

    messages = response.context['messages']

    matches = [m for m in messages if text in m.message]

    if len(matches) > 0:
        self.fail('Message(s) contained text "%s": %s' %
            (text, ", ".join(('"%s"' % m) for m in matches)))
票数 17
EN

Stack Overflow用户

发布于 2010-08-13 18:59:50

更新

我最初的回答是在django还在1.1岁左右的时候写的。这个答案已经不再重要了。有关更好的解决方案,请参阅@daveoncode的answer

原始答案

我做了一个实验来验证这一点。我将其中一个项目中的MESSAGE_STORAGE设置更改为'django.contrib.messages.storage.cookie.CookieStorage',并执行了我编写的用于检查消息的测试。啊,真灵。

与您所做的工作的关键区别在于我检索消息的方式。如下所示:

代码语言:javascript
复制
def test_message_sending(self):
    data = dict(...)
    response = self.client.post(reverse('my_view'), data)
    messages = self.user.get_and_delete_messages()

    self.assertTrue(messages)
    self.assertEqual('Hey there!', messages[0])

这可能值得一试。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2897609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档