带有参数的笑话模拟承诺
这是我试图用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));
}))