Шутка Обмани Обещание с Params - PullRequest
0 голосов
/ 28 января 2019

Это метод, который я пытаюсь написать модульным тестом в 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 не является функцией

Как мы можем насмехаться над такими функциями .promise () в Jest?

1 Ответ

0 голосов
/ 22 мая 2019

Причина, по которой .promise.mockImplementation не является функцией, заключается в том, что вызов getParameter(...) возвращает новый экземпляр / объект с новым .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));
}))
...