2016-10-10 15 views
0

I持って新しいコピーを作成するには、オブジェクトデータ(Draftschedule)をPOSTリクエストをexceptsで、そしてシリアライズ次のビュー、(FrozenSchedule):私は「Djangoのパッチ副作用IntegrityErrorが提起されていない

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が発生した後に特定のことが起こることを宣言するテストを書こうとしています。私はなぜそれが失敗しているのか理解するのには苦労しています。私が間違っているところは私にはすぐには分かりません。

私が呼ばれたときIntegrityErrorを高めるためにcreate_frozen_schedule機能をモックしようとしました:

def setUp(self): 
    self.url = reverse(
     'reports:draftschedule-freeze', 
     args=[self._client.draftschedule.pk] 
    ) 
    super(TestFreezeSchedule, self).setUp() 


@patch('reports.tasks.create_frozen_schedule') 
def test_freeze_schedule_with_conflict(self, mock_freeze): 
    mock_freeze.side_effect = IntegrityError 
    with self.assertRaises(IntegrityError): 
     self.client.post(self.url) 

    # More unit tests following same premise... 

しかし、私は次のエラーで終わる:注意すべき

.......................................................................................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',) 
    

副作用が提起されていない理由を任意のアイデア?

答えて

1

あなたのビューはIntegrityErrorをキャッチし、リダイレクトを返します。あなたのテストが呼び出すクライアントポストは、エラーを全く引き起こしません。

むしろ、あなたは除くブロック内のアクションが起こることをテストする必要があります:警告セットがあり、ポストではなく、冷凍1のドラフトスケジュールにリダイレクトありません。

0

あなたが本当にあなたの関数が例外をスローすることをテストしたい場合は、むしろ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) 
関連する問題