在路由内部模拟一个 api 函数调用而不实际调用它

Posted

技术标签:

【中文标题】在路由内部模拟一个 api 函数调用而不实际调用它【英文标题】:Mock an api function call inside of a route without actually calling it 【发布时间】:2019-03-30 18:29:09 【问题描述】:

我的 api 中有一条路由调用另一台服务器,但我遇到了一个问题,我无法为另一台服务器调用测试、模拟已解析的值。无论我如何处理,单元测试似乎总是调用其他服务器。

    let iAgent: PartialMock<InternalAgent>;

    beforeEach(() => 
        iAgent = 
            extend: jest.fn()
        ;
    );
if(iAgent.extend) 
    iAgent.extend.mockResolvedValue();


const r = await request.post('/api/v1/webhooks/extend')
.send(
    id: 1
);
expect(r.status).toEqual(200);
expect(iAgent.extend).toBeCalledTimes(1);

在我的实际路线中,它每次都会调用它:

await iAgent.extend();

并且由于其他服务器未运行而在此行失败,并且我收到拒绝连接的消息。显然iAgent.extend 函数甚至没有被调用一次,却设法返回了一个拒绝。

所以无论如何,我相信它不应该在我的路由中调用实际函数并跳过它,如果我理解正确,它会在测试中回退到我的解析值,但事实并非如此,我不确定如何继续。

哦,为了清楚 if 检查我的 mockResolvedValue,这只是为了暂时避免在我的配置中进行严格的空检查。但是我已经登录了条件,它确实模拟了值

【问题讨论】:

【参考方案1】:

天哪,我错过了这个。这里的问题是我的路由在所有应用程序中都使用相同的类实例,而我的单元测试试图模拟它的另一个实例——这就是为什么在调用其他服务器时在路由函数中没有使用解析的值.

因此,只需使用该代理类的相同实例,我就可以轻松获得我的模拟值

【讨论】:

以上是关于在路由内部模拟一个 api 函数调用而不实际调用它的主要内容,如果未能解决你的问题,请参考以下文章

在Android应用程序中模拟一个类 - 而不是在单元测试范围内

Asyncio 函数在从脚本调用而不是从 Flask 路由调用时有效

多次调用一个函数而不等待它完成

Json-server 模拟 API 而不是调用

函数指针转换为 void 而不被调用

Web API 和 AngularJs