我正在运行测试,并且对一个调用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()函数
答案 0 :(得分:1)
您只需要进行一次更改:
bar.deleteMessage
需要返回一个对象,其中将promise
属性设置为返回Promise
的函数:>
barObj.deleteMessage.mockImplementation(() => ({
promise: () => Promise.resolve({ status: 200 })
}));
...或者您可以根据需要将其缩短:
barObj.deleteMessage.mockReturnValue({
promise: () => Promise.resolve({ status: 200 })
});