Django声称响应包含一个可能的字符串列表之一

时间:2015-07-19 20:48:18

标签: python django unit-testing django-testing django-tests

我正在使用内置的测试工具为我的Django应用程序编写测试。现在,我正在尝试为显示用户关注者列表的页面编写测试。当用户没有关注者时,该页面将显示从字符串列表中随机选择的消息。举个例子:

NO_FOLLOWERS_MESSAGES = [
    "You don't have any followers.", 
    "Sargent Dan, you ain't got no followers!"
]

所以现在我想编写一个测试,断言响应包含其中一个字符串。如果我只使用一个字符串,我可以使用self.assertContains(request, "You don't have any followers."),但我仍然坚持如何编写具有多种可能结果的测试。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

这样的事情会起作用吗?

found_quip = [quip in response.content for quip in NO_FOLLOWERS_MESSAGES]
self.assertTrue(any(found_quip))

答案 1 :(得分:1)

试试这个:

if not any([x in response.content for x in NO_FOLLOWERS_MESSAGES]):
        raise AssertionError("Did not match any of the messages in the request")

关于any()https://docs.python.org/2/library/functions.html#any

答案 2 :(得分:1)

Internally assertContains(),使用_assert_contains()

中的计数

因此,如果您想要保留与assertContains()完全相同的行为,并且假设_assert_contains()的{​​{3}}不是微不足道的,那么您可以从源头获取灵感上面的代码并根据您的需求进行调整

我们的assertContainsAny()受assertContains()

的启发
def assertContainsAny(self, response, texts, status_code=200,
                      msg_prefix='', html=False):

    total_count = 0
    for text in texts:
        text_repr, real_count, msg_prefix = self._assert_contains(response, text, status_code, msg_prefix, html)
        total_count += real_count

    self.assertTrue(total_count != 0, "None of the text options were found in the response")

通过将参数texts作为列表传递来使用,例如

self.assertContainsAny(response, NO_FOLLOWERS_MESSAGES)