Django单元测试视图功能 - 示例

时间:2013-03-19 15:45:32

标签: django

我是Django测试中的新手。如何为此视图功能创建单元测试?我的单元测试功能应该从视图导入功能?请举个例子。这将有助于我理解它是如何工作的

@maintainance_job
def time_to_end(request):
    today = datetime.date.today()
    datas = Data.objects.filter(start__lte=today,
                                         other_date__gte=today)

    for data in datas:
        subject = _(u'Send email')
        body = render_to_string('mail.txt',
                                {'data': data})
        email = EmailMessage(subject, body,
                             'admin@admin.com',
                             [data.user.email])
        email.send()

    return HttpResponse('Done')

网址:

(r'^maintainance/jobs/time_to_end/$', 'content.views.time_to_end'),

1 个答案:

答案 0 :(得分:0)

对您的案例进行了最简单的测试(将其放在您的视图函数所在目录的tests.py中):

from django.utils import unittest
from django.test.client import Client

class HttpTester( unittest.TestCase ):
    def setUp( self ):
        self._client = Client() # init a client for local access to pages of your site

    def test_time_to_end( self ):

        response = self._client.get( '/jobs/time_to_end/' )
            # response = self._client.post( '/jobs/time_to_end/' ) - a 'POST' request

        result = response.content

        assert result != 'Done'

因此,我们使用self._client来发出'get'和'post'请求。如果您使用模板并希望访问传递给模板的变量,则可以通过阅读response.content(响应的全文)或阅读response.context来访问响应。

例如,如果您的视图通常必须将带有上下文变量'result'的dict传递给模板:

{ 'result': "DONE" }

然后你可以查看你的结果:

result = response.context[ 'result' ]           
assert result != 'Done'

所以,你等待你的测试将有'结果'变量,它将是'完成'。否则你引发AssertionError(注意断言语句)。

如果有异常,则测试失败。 AssertionError也是一个例外。

更多详细信息 - 在docs和书籍“Dive into Python”中。