gpt4 book ai didi

python - 如何使用 unittest.mock 调试补丁方法

转载 作者:行者123 更新时间:2023-12-02 02:44:11 25 4
gpt4 key购买 nike

我有以下(简化的)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

我哪里出错了/我该如何调试?

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

在与 View 相同的模块中修补函数时,出现以下错误:

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

最佳答案

  1. 如果您为check_existing_contacts from myapp import mailgun_validate_email,那么您需要修补该模块中的引用而不是myapp
    例如。如果导入在 myapp/views.py 中,则修补 myapp.views.mailgun_validate_email
  2. View 需要返回 HttpResponse 或其子类之一的实例,对于 mailgun_validate_email 也是如此,因为您直接返回 mailgun_validate_email(...).
# @patch('myapp.mailgun_validate_email')                                     # Change this
@patch('myapp.views.mailgun_validate_email', return_value=JsonResponse({})) # to this

关于python - 如何使用 unittest.mock 调试补丁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63073501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com