Django: 单元测试响应和会话中的HTML标签
有没有办法来测试从以下内容得到的HTML:
response = self.client.get('/user/login/')
我想要一个详细的检查,比如输入框的ID和其他属性。还有,关于已经设置的会话,能在测试中检查它们的值吗?
3 个回答
7
Simon Willison 的 soup-select 是一个很好的工具,可以根据类似 jQuery 的 CSS 选择器来测试 HTML 响应的内容。举个例子,如果你想检查你的页面上是否有一个 ID 为 my_input_id
的输入框,你可以这样做:
from BeautifulSoup import BeautifulSoup as Soup
from soupselect import select
response = self.client.get('/user/login/')
soup = Soup(response.content)
self.assertEquals(len(select(soup, 'input#my_input_id')), 1)
11
小心点。
那么,已经设置好的会话呢?在测试中能检查它们的值吗?
测试驱动开发(TDD)关注的是外部可见的行为。要查看用户是否有会话,你可以提供一个链接,这个链接只有在用户登录并且有会话时才能使用。
通常的做法是这样的:
class When_NoLogin( TestCase ):
def test_should_not_get_some_resource( self ):
response= self.client.get( "/path/that/requires/login" )
self.assertEquals( 301, response.status_code )
也就是说,当用户没有登录时,一些(或所有)网址会重定向到登录页面。
class When_Login( TestCase ):
def setUp( self ):
self.client.login( username='this', password='that' )
def test_should_get_some_resource( self ):
response= self.client.get( "/path/that/requires/login" )
self.assertContains( response, '<input attr="this"', status_code=200 )
self.assertContains( response, '<tr class="that"', count=5 )
而当用户登录时,一些(或所有)网址就会按预期正常工作。
此外,网址的响应中包含你需要的标签。
你并不是在测试Django是否创建了会话,因为Django已经有单元测试来验证这一点。你测试的是你应用程序的外部可见行为——它是否表现得像有会话一样?页面是否能正常显示?它们是否根据会话的具体信息进行了正确的定制?
8
不太确定,不过你可以看看这个链接:https://docs.djangoproject.com/en/dev/topics/testing/tools/#testing-responses。
response.context
可能是检查你值的一种方法。