我正在运行测试,并且正在 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
需要返回一个 object,promise
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/