[英]How to mock client object
我正在为我的 fastapi 项目编写单元测试。
一个端点包括获取 serviceNow 票证。 这是我要测试的代码:
from aiosnow.models.table.declared import IncidentModel as Incident
from fastapi import APIRouter
router = APIRouter()
@router.post("/get_ticket")
async def snow_get_ticket(req: DialogflowRequest):
"""Retrieves the status of the ticket in the parameter."""
client = create_snow_client(
SNOW_TEST_CONFIG.servicenow_url, SNOW_TEST_CONFIG.user, SNOW_TEST_CONFIG.pwd
)
params: dict = req.sessionInfo["parameters"]
ticket_num = params["ticket_num"]
try:
async with Incident(client, table_name="incident") as incident:
response = await incident.get_one(Incident.number == ticket_num)
stage_value = response.data["state"].value
desc = response.data["description"]
[...data manipulation, unimportant parts]
我遇到的问题是每次调用实际客户端并进行我不想要的 API 调用时,我都试图模拟客户端响应。
这是我的单元测试的当前版本:
from fastapi.testclient import TestClient
client = TestClient(app)
@patch("aiosnow.models.table.declared.IncidentModel")
def test_get_ticket_endpoint_valid_ticket_num(self, mock_client):
mock_client.return_value = {"data" : {"state": "new",
"description": "test"}}
response = client.post(
"/snow/get_ticket", json=json.load(self.test_request)
)
assert response.status_code == 200
我认为我的问题是修补了错误的对象,但我不确定还要修补什么。
在您的测试中,如果您不希望它转到 Service Now API,则调用client.post(...)
应该模拟此客户端。
变量赋值在 python 中的工作方式,更改aiosnow.models.table.declared.IncidentModel
不会更改您导入到 python 文件中的IncidentModel
。 您必须在使用对象的地方进行模拟。
所以而不是@patch("aiosnow.models.table.declared.IncidentModel")
,你想做@patch("your_python_file.IncidentModel")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.