繁体   English   中英

在 function 中存根特定的 API 请求

[英]Stubbing a specific API request inside a function

如何单独实现对父 function 内部调用的函数的存根?

假设我有这些函数 (req1,req2 ...) 是 HTTP 来自外部服务的请求都返回不同的值,有没有办法可以分别为 req1 或 req2 应用存根来模拟它们的值?

这样做的目的是因为我需要这样做来测试依赖于 OTP 验证的 function,并且我想绕过所述验证以覆盖我测试中的所有分支。

import request from 'request-promise'
const request1 = async (data) => return request({uri: "service1.com/get", method: "GET"})

const apiRequests = async (data) => {
   const req1 = await request1(data); // I want to mock this value to false
   const req2 = await request2(data); // I want to mock this value to true

   if (req1 && req2) {
    const req3 = await request3(data);
    const req4 = await request4(data);

    return "Second return"
   }
   return "First return"
}

每当试图了解 mocking 的更深层次时,我总是不知所措,而我在网上看到的大多数示例都没有像我所面临的问题那样嵌套,所以我对如何解决 go 感到有点困惑。

我也在一个非常严格的设置中工作,所以我真的不允许使用Loopback 的内置测试库之外的任何其他库/包。

您可以使用stub.onCall(n) API。

定义存根在第 n 次调用时的行为。 对于测试顺序交互很有用。

此外, sinon 不支持从 package 导入的独立 function 存根,您需要使用链接接缝,因此我们使用代理查询ZEFE90A8E604A7C840E88D03A67F6来构造接缝。

例如

apiRequest.ts

import request from 'request-promise';

const request1 = async (data) => request({ uri: 'service1.com/get', method: 'GET' });

export const apiRequests = async (data) => {
  const req1 = await request1(data);
  const req2 = await request1(data);
  console.log(req1, req2);

  if (req1 && req2) {
    const req3 = await request1(data);
    const req4 = await request1(data);

    return 'Second return';
  }
  return 'First return';
};

apiRequest.test.ts

import proxyquire from 'proxyquire';
import sinon from 'sinon';

describe('70241641', () => {
  it('should second return', async () => {
    const rpStub = sinon.stub().onCall(0).resolves(true).onCall(1).resolves(true);
    const { apiRequests } = proxyquire('./apiRequest', {
      'request-promise': rpStub,
    });
    const actual = await apiRequests('test data');
    sinon.assert.match(actual, 'Second return');
  });

  it('should first second', async () => {
    const rpStub = sinon.stub().onCall(0).resolves(false).onCall(1).resolves(true);
    const { apiRequests } = proxyquire('./apiRequest', {
      'request-promise': rpStub,
    });
    const actual = await apiRequests('test data');
    sinon.assert.match(actual, 'First return');
  });
});

测试结果:

  70241641
true true
    ✓ should second return (2374ms)
false true
    ✓ should first second


  2 passing (2s)

---------------|---------|----------|---------|---------|-------------------
File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------|---------|----------|---------|---------|-------------------
All files      |     100 |      100 |     100 |     100 |                   
 apiRequest.ts |     100 |      100 |     100 |     100 |                   
---------------|---------|----------|---------|---------|-------------------

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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