2016-05-31 15 views
0

私はAPIをレビューするコードであり、これをユニットテストで見つけました。テストは合格しますが、理由を理解できません。Djangoユニットのテスト - assertRaisesは動作しないときに動作する

class SomeTestCase(TestCase): 

    def setUp(self): 
     self.client = Client() 

    @mock.patch("patch.a.thing", mock_function) 
    def test_fail(self): 
     request_data = { 
      "some": "bad data" 
     } 

     response = self.client.post(
      "/path/to/api", 
      json.dumps(request_data), 
      content_type="application/json", 
      HTTP_HEADERNAME=HEADER_VALUE 
     ) 

     self.assertRaises(Exception, response) 

私たちは悪いデータを渡しているので、APIから500ステータスコードが必要です。 APIを呼び出すことによって例外が発生したとしても、ユニットテストをエラーにする場合はclient.postの間に呼び出されませんか? responseは呼び出し可能ではないので、それをassertRaisesに渡すのは間違いですが、私が見ると予想される動作は、assertRaisesは例外を受けないため、ユニットテストは失敗します。それがなぜこのように振る舞うのか誰も説明できますか?

編集:

私はこれをテストし、このユニットテストは同様に渡し:

class ThingTestCase(TestCase): 

    def test_thing_fails(self): 
     x = True 
     y = False 
     z = {"some": "thing"} 

     self.assertRaises(Exception, x) 
     self.assertRaises(Exception, y) 
     self.assertRaises(Exception, z) 
     self.assertRaises(Exception) 
+0

アサーションの前に 'response = self.client.post(...)' *を呼び出すので、期待される例外が発生していないかのように見えます。これは、あなたのモンキータイピングが機能していないことを示唆しています。 – Alasdair

答えて

1

あなたはassertRaisesに呼び出し可能に合格する必要があります

self.assertRaises(Exception, self.client.post, 
     "/path/to/api", 
     json.dumps(request_data), 
     content_type="application/json", 
     HTTP_HEADERNAME=HEADER_VALUE 
) 

使用することを明確かもしれませんコンテキストマネージャーとして:

with self.assertRaises(Exception) 
    response = self.client.post(
     "/path/to/api", 
     json.dumps(request_data), 
     content_type="application/json", 
     HTTP_HEADERNAME=HEADER_VALUE 
    ) 

現在、self.assertRaises(Exception, response)responseを呼び出しようとしますが、これは呼び出し可能でないためTypeErrorを発生させます。 assertRaisesExceptionと呼んでいるので、テストに合格します。このような問題を避けるには、Exceptionではなく、より具体的なエラー(例:ValueError)を使用することをおすすめします。 xを呼び出すとTypeErrorを上げるために例えば、

x = True 
    self.assertRaises(ValueError, x) 

は、失敗します。

関連する問題