2016-05-18 5 views
0

データベースに重複レコードがある場合にIntegrityErrorが生成されたかどうかを確認するテストを作成しました。このシナリオを作成するために、私はREST APIを2回発行しています。コードは次のようになります。UnittestをDjango Restフレームワークで実行しているときのTransactionManagementError

class TestPost(APITestCase): 
    @classmethod 
    def setUpClass(cls): 
     super().setUpClass() 
     common.add_users() 

    def tearDown(self): 
     super().tearDown() 
     self.client.logout() 

    def test_duplicate_record(self): 
     # first time 
     response = self.client.post('/api/v1/trees/', dict(alias="some name", path="some path")) 
     # same request second time 
     response = self.client.post('/api/v1/trees/', dict(alias="some name", path="some path")) 
     self.assertEqual(response.status_code, status.HTTP_400_BAD_RREQUEST) 

しかし、私は、これは確かに望ましくないこのエラーを回避することができますどのようにこの

"An error occurred in the current transaction. You can't " 
django.db.transaction.TransactionManagementError: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block. 

のようなエラー・スタックを取得します。

+0

完全なトレースバックを表示してください。 – Alasdair

答えて

1

tearDownメソッドからself.client.logout()を削除してみます。 Djangoは各テストの終了時にトランザクションをロールバックします。手動でログアウトする必要はありません。

+0

うわー!ログアウトを削除しても問題は解決しました。 「トランザクション」が最初の場所に来て、「ログアウト」を削除すると実際にそれを解決した理由を理解してください。私はtest.APITestCaseが私が思う以上のことをしていると思います。 –

+0

いずれかのテストでエラーが発生しました。次に、ティアダウンメソッドで 'self.client.logout()'を呼び出しました。エラーが発生した後にトランザクションでクエリを実行することができないため、これは不可能です。 – Alasdair

関連する問題