如何使用unittest.mock调试修补方法

时间:2020-07-24 12:24:09

标签: python django python-unittest django-testing python-mock

我有以下(简化的)FBV:

def check_existing_contacts(request):
    if request.is_ajax and request.method == "GET":
        print('Function called')
        return mailgun_validate_email(request)
    return JsonResponse({"error": "Incorrect AJAX / GET request."}, status=400)

我要测试mailgun_validate_email函数是否被调用:

class TestCheckExistingContacts(TestCase):

    @patch('myapp.mailgun_validate_email')
    def test_new_contact(self, mock):
        client = Client()
        client.get('/check/', HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        self.assertTrue(mock.called)
 

我可以肯定,测试mailgun_validate_email会在控制台中显示print('Function called')。但是我收到一个断言错误,表明mock.calledFalse

我要去哪里了/如何调试呢?

************ 更新 *******************

在与视图相同的模块中修补功能时,出现以下错误:

class TestCheckExistingContacts(TestCase):

    @patch('[path to views.py with check_existing_contacts].mailgun_validate_email')
    def test_new_contact(self, mock):
        client = Client()
        client.get('/check/', HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        self.assertTrue(mock.called)

结果:

Failure
Traceback (most recent call last):
  File "\tests\test_utils.py", line 123, in test_new_contact
    response = self.client.get('/validate/',
  File "\.venv\lib\site-packages\django\test\client.py", line 518, in get
    response = super().get(path, data=data, secure=secure, **extra)
  File "\.venv\lib\site-packages\django\test\client.py", line 344, in get
    return self.generic('GET', path, secure=secure, **{
  File "\.venv\lib\site-packages\django\test\client.py", line 421, in generic
    return self.request(**r)
  File "\.venv\lib\site-packages\django\test\client.py", line 496, in request
    raise exc_value
  File "\.venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "\.venv\lib\site-packages\django\utils\deprecation.py", line 96, in __call__
    response = self.process_response(request, response)
  File "\.venv\lib\site-packages\django\contrib\sessions\middleware.py", line 45, in process_response
    patch_vary_headers(response, ('Cookie',))
  File "\.venv\lib\site-packages\django\utils\cache.py", line 267, in patch_vary_headers
    vary_headers = cc_delim_re.split(response['Vary'])
TypeError: expected string or bytes-like object

0 个答案:

没有答案