如何在 Django 中编写单元测试

How to write Unit Test in Django

我正在尝试编写单元测试,但我是 django 的新手,不确定如何测试此功能。据我所知,在手动测试时一切正常,但建议为其编写单元测试。

我有这个功能:

def time_encode(hours):
    now = timezone.now().replace(second=0, microsecond=0)
    remainder = now.minute % 15
    delta = (15 - remainder)
    timeFrom = now + timedelta(minutes=delta)
    timeTo = timeFrom + timedelta(hours=hours)
    return (timeFrom, timeTo)

在此视图中调用:

@csrf_exempt
def emulate_create(request):
    args = json.loads(request.body, object_hook=utils._datetime_decoder)
    resourceId, count, hours = args['resourceId'], args['count'], args['hours']
    print resourceId
    timeFrom, timeTo = utils.time_encode(hours)
    print timeFrom
    reservation = ReservationProspect(
        byUser=request.user,
        forUser=request.user,
        resource=get_object_or_404(Resource, uuid=resourceId),
        modality=get_object_or_404(Modality, name="online"),
        timeFrom=timeFrom,
        timeTo=timeTo,
        count=count
     )

    return HttpResponse(
        json.dumps(
            [reservation.toDict()],
            default=utils._datetime_encoder
        )
    )

我觉得我不应该测试视图中的内容,但我应该为一些测试用例测试函数 time_encode,因为它的目的是 return 最近的 15 个 timeFrom未来的分钟间隔和 timeTo 是 'hours' 参数远离 timeFrom。同样重要的是,日期时间始终 returned 秒和毫秒为零。您对如何测试此代码有何建议?

我想我会为函数编写至少两个单元测试(一个检查是否针对给定的输入生成预期的输出。

然后另外我会为视图本身编写一些测试,例如它会产生预期的输出吗? 404 是否按预期返回?

我也会考虑测试这个 ReservationProspect class 以防它是你的。

测试挺多的,不过我一般都是遵循测试驱动开发,有条件的时候提前写测试。它非常适合我。

...顺便说一下,如果您关于测试 Django/Python 的问题更笼统——Django 在他们的网页上有一些好东西 https://docs.djangoproject.com/en/1.8/topics/testing/overview/ 在教程中: https://docs.djangoproject.com/en/1.8/intro/tutorial05/

from django.test import TestCase
class ViewTest(TestCase):

    def test_view_returns_OK(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code,200)

class FunctionTest(TestCase):

    def test_function_returns_expected_result(self):
        response = time_encode(10)
        expected = "XYZ"
        self.assertEqual(response, expected)

关于您对导入的评论:

from utils import time_encode 

- 在上述导入之后你可以将其用作 time_encode

import utils 

- 在上述导入之后你必须将它用作 utils.time_encode