2016-05-31 2 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) 

Мы ожидаем код статуса 500 из API, поскольку мы передаем плохие данные. Даже если вызов API должен был вызвать исключение, не было бы ли это повышаться в течение client.post обкатки модульного теста на ошибку? response не является вызываемым, и поэтому неправильно передавать его на assertRaises, однако поведение, которое я ожидаю увидеть, заключается в том, что assertRaises не получает исключения, и поэтому модульный тест терпит неудачу. Может ли кто-нибудь объяснить, почему он ведет себя таким образом?

Edit:

Я просто проверил это, и это испытательная установка проходит так:

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 (...)' * перед * вашим утверждением, похоже, что это не повышает ожидаемое исключение. Это говорит о том, что ваш monkeypatching не работает. – 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, потому что оно не подлежит вызову. Потому что вы звоните assertRaises с Exception, тест проходит. Рекомендуется использовать более конкретную ошибку (например, ValueError), а не Exception, чтобы избежать подобных проблем. Например,

x = True 
    self.assertRaises(ValueError, x) 

потерпит неудачу, потому что вызов x поднимает TypeError.

Смежные вопросы