存根函数返回.promise()可接受的值

时间:2019-03-25 20:55:01

标签: javascript amazon-web-services jestjs

我正在运行测试,并且对一个调用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 个答案:

答案 0 :(得分:1)

您只需要进行一次更改:

bar.deleteMessage需要返回一个对象,其中将promise 属性设置为返回Promise的函数:

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

...或者您可以根据需要将其缩短:

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