3

我正在使用内置测试工具为我的 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."),但我被困在如何编写具有多种可能结果的测试。任何帮助,将不胜感激。

4

3 回答 3

3

尝试这个:

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

于 2015-07-19T20:54:50.653 回答
2

像这样的东西会起作用吗?

found_quip = [quip in response.content for quip in NO_FOLLOWERS_MESSAGES]
self.assertTrue(any(found_quip))
于 2015-07-19T20:54:29.660 回答
2

在内部 assertContains(),使用来自的计数_assert_contains()

因此,如果您想保留与 完全相同的行为assertContains(),并且鉴于 的实现_assert_contains()非易事,您可以从上面的源代码中获得灵感,并根据您的需要进行调整

我们的 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)
于 2015-07-19T21:04:28.617 回答