繁体   English   中英

如何模拟客户端对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM