Функция-заглушка для возврата чего-то приемлемого для .promise () - PullRequest
1 голос
/ 25 марта 2019

Я запускаю тесты и заглушаю функцию, которая вызывает функцию AWS sqs.deleteMessage..promise () вызывается при вызове этой функции.Каждый раз, когда я запускаю свои тесты с покрытием, я замечаю, что он переходит к блоку catch, поэтому при вызове .promise () должна происходить ошибка.

Я пытался заглушить функцию, чтобы разрешить обещание, ноэто не похоже на работу.Я также пытался вернуть данные, но у меня все та же проблема.

Ниже приведен пример кода, который я пытаюсь протестировать.Он никогда не достигает строки logger.info ()

fooObj.js

const foo = async (req) => {
  try{
    let res = await bar.deleteMessage(handle).promise();
    logger.info("Sqs result message " + JSON.stringify(res));
  } catch(error){
   #catch block code
  }
}

Ниже приведен код для bar.deleteMessage () bar.js

const aws = require('aws-sdk');
const sqs = new aws.SQS();

deleteMessage = function(handle){
  return sqs.deleteMessage({
    ReceiptHandle: handle 
   });
}

И, наконец, вот тестовый код

const fooObj = require('foo')
const barObj = require('bar')
jest.mock('bar')

describe('foo test', ()=>{
  test('a test' , ()=>{
    barObj.deleteMessage.mockImplementation(()=>{
      return Promise.resolve({status:200})
    });

    return fooObj.foo(req).then(data=>{
      #Expect statements here
    })
  }
}

Так что я бы хотел, чтобы строка logger.info была достигнута в покрытии, но я предполагаю, что проблема связана с тем, как я заглушаю функцию bar.deleteMessage.Я мог бы использовать aws-sdk-mock, но мне кажется, что я нарушаю принципы модульного тестирования, высмеивая вызов sqs, находящийся в другом файле, и правильный способ сделать это - просто заглушить функцию bar.deletemessage ()

1 Ответ

1 голос
/ 26 марта 2019

Вам просто нужно одно изменение:

bar.deleteMessage необходимо вернуть объект со свойством promise , установленным на функцию, которая возвращает Promise:

barObj.deleteMessage.mockImplementation(() => ({
  promise: () => Promise.resolve({ status: 200 })
}));

... или вы можете сократить его до этого, если хотите:

barObj.deleteMessage.mockReturnValue({
  promise: () => Promise.resolve({ status: 200 })
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...