Django测试:测试页面中是否出现了一定数量的元素?

时间:2015-05-22 11:32:08

标签: django

我在Django 1.8工作。我想测试一下我的页面中有四个<li>个元素。

这是我现有的test_views.py

def test_call_view_bnf_all(self):
    response = self.client.get('/bnf/')
    self.assertEqual(response.status_code, 200)
    context_sections = response.context['sections']
    self.assertEqual(len(context_sections), 4)

    self.assertTemplateUsed(response, 'all_bnf.html')
    self.assertContains(response, '<h1>All BNF sections</h1>')

如何测试页面中有四个<li>元素,而不是提供所有原始HTML并执行assertContains

3 个答案:

答案 0 :(得分:1)

assertContains()内置了count选项:

assertContains(response, text, count=None, status_code=200, msg_prefix='', html=False)
     

如果提供计数文字必须在响应中完全计数次。

因此,您可以使用:

self.assertContains(response, '</li>', 4)

答案 1 :(得分:0)

我会使用BeautifulSoup来实现这一目标。有点像:

def test_call_view_bnf_all(self):
    response = self.client.get('/bnf/')
    response_soup = BeautifulSoup(response.content)

    li_elements = response_soup.find_all('li')
    self.assertEqual(len(li_elements), 4)

答案 2 :(得分:0)

我一直在使用PyQuery来做这种事情。基本上,您最终会编写一个jquery选择器,然后测试结果。与jquery兼容的好处是你可以先在浏览器中测试你的选择器。

到目前为止对PyQuery非常满意,除了它有一个lxml依赖项,我发现使用Chef安装很有挑战性。

data = PyQuery(response.content)
result = data("li")

#haven't used PyQuery to check the length of a result yet
#might be
self.assertEqual(4,len(result))