Django补丁的副作用IntegrityError未引发

2024-09-30 22:28:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下视图,除了POST请求,并序列化一个对象数据(Draftschedule)来创建一个新的副本(FrozenSchedule):

from reports.tasks import create_frozen_schedule

def freeze_schedule(request, pk):
    """Valid post request will freeze a Draft Schedule serializing its data"""
    client = get_object_or_404(Client, draftschedule=pk)
    try:
        # Serialize data into a FrozenSchedule object
        frozenschedule = create_frozen_schedule(pk, request.user.id)
    except IntegrityError:
        # Warn user if action failed
        messages.warning(request, "A Schedule of this Type already exists")
        return redirect(client.draftschedule)
    else:
        # If Schedule is Frozen successfully
        messages.success(request, "Schedule Frozen")
        return redirect(frozenschedule)

我试图编写一个测试来断言在IntegrityError被引发后发生的某些事情。我正在努力理解它为什么会失败,因为我对嘲弄/修补相当缺乏经验,所以我不太清楚我到底哪里出了问题。在

我试图模拟create_frozen_schedule函数,以便在调用时引发IntegrityError:

^{pr2}$

但最后我得出了以下错误:

.......................................................................................F............
======================================================================
FAIL: test_freeze_schedule_with_conflict (reports.tests.test_views.TestFreezeSchedule)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.4/unittest/mock.py", line 1136, in patched
    return func(*args, **keywargs)
  File "/home/jwe/piesup2/reports/tests/test_views.py", line 495, in test_freeze_schedule_with_conflict
    self.client.post(self.url)
AssertionError: IntegrityError not raised

----------------------------------------------------------------------

注意事项:

  • 我可以在我实际的Django站点的测试之外复制这个错误。在
  • 我故意省略了create_frozen_schedule代码,因为 连载是相当冗长的,据我所知 实现细节无论如何都不重要,因为我在嘲笑 功能。在
  • IntegrityError本身的目的是防止重复的FrozenSchedule对象,其元类如下所示:

    class Meta:
        # ...
        unique_together = ('client', 'data',)
    

你知道为什么没有引起副作用吗?在


Tags: 对象testclientdatareturnrequestcreateschedule
2条回答

如果你想真正测试你的函数抛出了异常,你需要直接测试这个函数,而不是通过POST。比如:

from django.test import RequestFactory

@patch('reports.tasks.create_frozen_schedule')
def test_freeze_schedule_with_conflict(self, mock_freeze):
    mock_freeze.side_effect = IntegrityError
    myrequest = RequestFactory().post(*some_url*)
    # you may need to add, e.g., items to myrequest.POST
    with self.assertRaises(IntegrityError):@patch('reports.tasks.create_frozen_schedule')
        freeze_schedule(myrequest, pk)

视图捕捉IntegrityError并返回重定向。测试调用的客户端post根本不会引发错误。在

相反,您应该测试except块中的操作是否发生:是否设置了警告,post是否重定向到草稿计划而不是冻结的计划。在

相关问题 更多 >