带有参数的笑话模拟承诺 [英] Jest Mock Promise with Params

查看:208
本文介绍了带有参数的笑话模拟承诺的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我试图用Jest编写单元测试的方法

This is the method I am trying to write Unit test in 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);
  }
}

测试方法:

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);
});

我收到错误消息:

TypeError: ssmClient.getParameter(...).promise.mockImplementation不是函数

TypeError: ssmClient.getParameter(...).promise.mockImplementation is not a function

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

How do we mock such .promise() functions in Jest ?

推荐答案

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

The reason why .promise.mockImplementation is not a function is that calling getParameter(...) returns a new instance/object with a new .promise().

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

So in your first line: ssmClient.getParameter(params).promise = jest.fn(); you only set that instance with jest.fn().

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

In the second line you're actually calling .mockImplementation() on a brand new instance.

相反,您将不得不模拟getParameter()来确保它每次都返回您的模拟.

Instead you're going to have to mock getParameter() to make sure it returns your mock everytime.

ssmClient.getParameter = jest.fn();
ssmClient.getParameter.mockImplementation(() => ({
    promise: jest.fn().mockImplementation(() => Promise.resolve(mockedResponseData));
}))

这篇关于带有参数的笑话模拟承诺的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆