gpt4 book ai didi

python - 使用 python 模拟库测试与 Django Rest Framework API 交互的函数

转载 作者:行者123 更新时间:2023-12-01 09:03:02 27 4
gpt4 key购买 nike

我想对与使用 Django Rest Framework 构建的 API 交互的模块进行单元测试。为此,我使用 python 模拟库。由于我没有使用模拟来测试与 API 交互的经验,因此我遇到了问题。

将对象发送到 API 端点的函数是这样的(简而言之):

def send_experiment_to_portal(experiment: Experiment):
rest = RestApiClient()

if not rest.active:
return None

# general params
params = {"nes_id": str(experiment.id),
"title": experiment.title,
"description": experiment.description,
"data_acquisition_done":
str(experiment.data_acquisition_is_concluded),
"project_url": experiment.source_code_url,
"ethics_committee_url": experiment.ethics_committee_project_url
}

action_keys = ['experiments', 'create']

portal_experiment = rest.client.action(
rest.schema, action_keys, params=params,
)

return portal_experiment

RestAPIClient 是对 API 进行身份验证的类:

class RestApiClient(object):
client = None
schema = None
active = False

def __init__(self):
auth = coreapi.auth.BasicAuthentication(
username=settings.PORTAL_API['USER'],
password=settings.PORTAL_API['PASSWORD']
)
self.client = coreapi.Client(auth=auth)

try:
url = settings.PORTAL_API['URL'] + \
(
':' + settings.PORTAL_API['PORT'] if
settings.PORTAL_API['PORT'] else ''
) \
+ '/api/schema/'

self.schema = self.client.get(url)
self.active = True
except:
self.active = False

RestApiClient 类使用 coreapi 客户端模块连接到 API。

所以,最后,我从测试 rest.client.action 中的 params 参数是否具有 API 预见的键/值开始使用 python 模拟库。

我开始编写初始测试,例如:

class PortalAPITest(TestCase):

@patch('experiment.portal.RestApiClient')
def test_send_experiment_to_portal(self, mockRestApiClientClass):
research_project = ObjectsFactory.create_research_project()
experiment = ObjectsFactory.create_experiment(research_project)

result = send_experiment_to_portal(experiment)

因此,当我调试测试时,查看 send_experiment_to_portal 函数 rest.client.action.call_args 的值:

call(<MagicMock name='RestApiClient().schema' id='139922756141240'>, ['expreiments', 'create'], params={'description': 'Descricao do Experimento-Update', 'ethics_committee_url': None, 'project_url': None, 'title': 'Experimento-Update', 'nes_id': '37', 'data_acquisition_done': 'False'})

但是mockRestApiClientClass.client.action.call_argsNone。我怀疑我做错了。我应该模拟rest.client.action而不是RestApiClient类。

尝试使用结果值也不起作用。

结果值为

<MagicMock name='RestApiClient().client.action()' id='139821809672144'>

并且result.call_args也是None

但是该怎么做呢?如何在 send_experiment_to_portal 函数之外获取模拟 rest 实例?

最佳答案

经过几天的努力,我找到了解决方案。

模拟RestApiClient返回类的模拟而不是其值,即rest变量的值。我们从模拟对象调用 return_value 获取 rest 值。

因此,我们必须调用 mockRestApiClientClass.return_value 而不是 mockRestApiClientClass

通过这样做,我们可以访问从 send_experiment_end_message_to_portal 内部调用的 rest 方法和属性,然后mockRestApiClientClass.return_value.client.action.call_args 将具有与 send_experiment_end_message_to_portal 函数上下文中观察到的 rest 内容相同的内容。

关于python - 使用 python 模拟库测试与 Django Rest Framework API 交互的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52313432/

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