Django: 单元测试响应和会话中的HTML标签

7 投票
3 回答
6519 浏览
提问于 2025-04-15 22:48

有没有办法来测试从以下内容得到的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 )

https://docs.djangoproject.com/en/dev/topics/testing/tools/#django.test.SimpleTestCase.assertContains

而当用户登录时,一些(或所有)网址就会按预期正常工作。

此外,网址的响应中包含你需要的标签。

你并不是在测试Django是否创建了会话,因为Django已经有单元测试来验证这一点。你测试的是你应用程序的外部可见行为——它是否表现得像有会话一样?页面是否能正常显示?它们是否根据会话的具体信息进行了正确的定制?

8

不太确定,不过你可以看看这个链接:https://docs.djangoproject.com/en/dev/topics/testing/tools/#testing-responses

response.context 可能是检查你值的一种方法。

撰写回答