带参数的 Jest Mock Promise

Shi*_*MSK 2 node.js jestjs aws-sdk ssm aws-sdk-js

这是我尝试在 Jest 中编写单元测试的方法

async function getParameter(parameter: string,
  withDecryption: boolean = false): Promise<String> {

  const params = {
    Name: parameter,
    WithDecryption: withDecryption,
  };
  try {
    const request = await       ssmClient.getParameter(params).promise();

    return request.Parameter.Value;
  } catch (err) {
    logger.error(`Error ${err}`);
    throw Error(err);
  }
}
Run Code Online (Sandbox Code Playgroud)

测试方法 :

test('getParameterFromSystemManager', async () => {
  const mockedResponseData = {
    Parameter: {
      Value: 'parameterValue',
    },
  };

 ssmClient.getParameter(params).promise = jest.fn();

 ssmClient.getParameter(params).promise.mockImplementation(() => Promise.resolve(mockedResponseData));

 const data = 
 await SSMParameters.getParameterFromSystemManager('testurl', false, 
 'Test', 'elastic');
 expect(data).toEqual(mockedResponseData.Parameter.Value);
 expect(ssmClient.getParameter).toHaveBeenCalledTimes(1);
});
Run Code Online (Sandbox Code Playgroud)

我收到错误:

类型错误:ssmClient.getParameter(...).promise.mockImplementation 不是函数

我们如何在 Jest 中模拟此类 .promise() 函数?

小智 6

.promise.mockImplementation不是函数的原因是调用getParameter(...)返回一个带有 new 的新实例/对象.promise()。

因此,在第一行中:ssmClient.getParameter(params).promise = jest.fn();您只使用 来设置该实例jest.fn()。

在第二行中,您实际上正在调用.mockImplementation()一个全新的实例。

相反,您将不得不进行模拟getParameter()以确保它每次都返回您的模拟。

ssmClient.getParameter = jest.fn();
ssmClient.getParameter.mockImplementation(() => ({
    promise: jest.fn().mockImplementation(() => Promise.resolve(mockedResponseData));
}))
Run Code Online (Sandbox Code Playgroud)