我怎么能做这样一个典型的单元测试?

时间:2010-05-10 03:41:04

标签: python django testcase

这是我项目中的一个简单结构:

MyAPP---
        note---
               __init__.py
               views.py
               urls.py
               test.py
               models.py
        auth--
              ...
        template---
                   auth---
                          login.html
                          register.html
                   note---
                          noteshow.html
                   media---
                           css---
                                 ...
                           js---
                                 ...
        settings.py
        urls.py
        __init__.py
        manage.py

我想制作一个单元测试,可以测试noteshow页面是否正常工作。

代码:

from django.test import TestCase

class Note(TestCase):
    def test_noteshow(self):
        response = self.client.get('/note/')
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, '/note/noteshow.html')

问题是我的项目包含一个auth mod,它会强制unlogin用户在访问noteshow.html时重定向到login.html页面。

所以,当我运行我的unittest时,在bash中它会引发一个失败,即response.status_code总是302而不是200.

好吧,虽然通过这个结果,我可以检查auth mod运行良好,它不像我想要的那样。

好的,问题是我怎么能让另一个单元测试来检查我的noteshow.template是否被使用?

谢谢大家。

django版本:1.1.1

python版本:2.6.4

将Eclipse用于MAC OS

1 个答案:

答案 0 :(得分:6)

只需为每个测试登录用户。执行此操作的最佳方法是使用setUp()方法创建客户端,创建用户,然后将用户登录。还可以使用tearDown()方法执行相反操作(注销用户和删除)用户)。

方法setUp()tearDown()会自动为测试集中的每个测试运行。

它看起来像这样:

class Note(TestCase):
    def setUp(self):
        self.client = Client()
        self.new_user = User.objects.create_user('blah', 'blah@blah.com', 'blah')
        self.new_user.save()
        self.client.login(username='blah', password='blah')

    def tearDown(self):
        self.client.logout()
        self.new_user.delete()

    def test_noteshow(self):
        response = self.client.get('/note/')
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, '/note/noteshow.html')

希望这有帮助。