【发布时间】:2021-10-12 11:04:58
【问题描述】:
我有一个包含端点的 Django 代码库。端点做了很多事情,我现在想检查端点是否使用特定的令牌调用函数do_metadata_request(粘贴在下面)。
def do_metadata_request(url_info, token):
metadata_url = f"{settings.META_SERVER_BASE_URL}/{url_info['dossier']}"
headers = {}
if token:
headers['Authorization'] = token
return requests.get(metadata_url, headers=headers)
所以经过一番摆弄后,我进行了以下设置。它可以工作,但它在我在测试本身之外定义的模拟函数中进行实际测试。它根本感觉不到优雅或 Pythonic。我宁愿在测试中做断言,或者至少在测试中定义 mock_do_metadata_request。
有人知道如何更优雅地做到这一点吗?
class MockResponse:
def __init__(self, status_code, json_content=None, content=None, headers=None):
self.status_code = status_code
self.json_content = json_content
self.content = content
self.headers = headers
def json(self):
return self.json_content
MOCK_TOKEN = "Bearer " + create_test_token([settings.EXTENDED_SCOPE])
def mock_do_metadata_request(url_info, token):
assert token == MOCK_TOKEN
return MockResponse(
200,
json_content={
'access': settings.ACCESS_RESTRICTED,
'documents': [{'barcode': '123', 'access': settings.ACCESS_RESTRICTED}]
}
)
class TestFileRetrieval(TestCase):
def setUp(self):
self.c = Client()
@patch('project.metadata.do_metadata_request', side_effect=mock_do_metadata_request)
def test_token_is_passed_on_to_metadata_server(self, mock_do_metadata_request):
header = {'HTTP_AUTHORIZATION': MOCK_TOKEN}
response = self.c.get(IMG_URL, **header)
【问题讨论】:
标签: python django unit-testing mocking pytest