javascript - stub 函数以返回 .promise() 可接受的内容

标签 javascript amazon-web-services jestjs

我正在运行测试,并且正在 stub 一个调用 AWS sqs.deleteMessage 函数的函数。 .promise() 在调用此函数时被调用。每次我用覆盖率运行我的测试时,我注意到它跳转到 catch block ,因此我的 .promise() 调用一定发生了错误。

我已经尝试对函数进行 stub 以解决 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() 的代码 酒吧.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 行,但我认为这个问题与我如何 stub bar.deleteMessage 函数有关。我可以使用 aws-sdk-mock 但我觉得我通过模拟另一个文件中的 sqs 调用违反了单元测试原则,正确的方法只是正确地 stub bar.deletemessage() 函数

最佳答案

你只需要一个改变:

bar.deleteMessage 需要返回一个 objectpromise property 设置为返回 promise :

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

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

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

关于javascript - stub 函数以返回 .promise() 可接受的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55346261/

相关文章:

javascript - Jest 异步测试忽略expect()函数

javascript - 如何在 Javascript 中定义自动重新启动的简单倒计时

javascript - 我的函数没有触发。我缺少什么?

testing - 如何使用带有 Jest 的 Mongoose 测试 GraphQL 服务器

mysql - .Net CLI MySQL RDS 连接失败

amazon-web-services - Amazon EC Redis 是否是一种有效的缓存解决方案?

reactjs - “JestSerializer”不可分配给类型为 'SnapshotSerializerPlugin' 的参数

javascript - 如果 Jquery 加载失败则加载

javascript - 警报中的重音字母格式不正确?

python - 使用 DomainKey 和 Amazon SES 签名的 Django 重置密码电子邮件