DynamoDB Documentclient的模拟承诺

时间:2019-03-15 19:05:43

标签: javascript amazon-web-services jestjs

因此,我正在运行一些单元测试,并且我本质上想对promise进行存根,以便它在需要时可以解决或拒绝。这是我的代码。

getStatusForPromiseID = async (promiseId, docClient) => {
    let data = await getStatusfromDB(promiseId, docClient);
    console.log("data.Items =========>", data.Items);
    return {
        "promiseId": data.Items[0].event_id,
        "status": data.Items[0].STATUS,
        "errors":data.Items[0].ERRORS
    }

}

function getStatusfromDB(promiseId, docClient) {
    console.log("In getActiveTokenFromDB " + promiseId);

    var params = {
        TableName: 'epayments-nonprod-transactions',
        KeyConditionExpression: 'event_id = :event_id',
        ExpressionAttributeValues: {
            ':event_id': promiseId
        }
    };

    return docClient.query(params).promise();

}

我想模拟docClient.query(params).promise()

这是我当前测试的样子,它可以运行,但是在我调试时说resObj的PromiseStatus被拒绝。我想对其进行模拟,以便可以在data.Items中包含要声明的值。

describe('App function tests', ()=>{


    test('getStatusForPromiseID', ()=>{

        let docClient = new aws.DynamoDB.DocumentClient()
        docClient.query.promise = jest.fn()
        docClient.query.promise.mockImplementation(cb =>{
            cb(true, {Items: [1,2,3]})
        })


        let resObj = getStatusForPromiseID('11011', docClient)
        expect(docSpy).toHaveBeenCalled()

    })
})

1 个答案:

答案 0 :(得分:1)

您可以使用aws-sdk-mock模拟具有自定义响应的DynamoDB DocumentClient。

要模拟成功的响应,您可以执行以下操作:

write(file, array[0], 3)

要模拟错误,只需执行以下操作:

AWS.mock('DynamoDB.DocumentClient', 'query', function(params, callback) {
  callback(null, {Items: [1, 2, 3]});
});

请记住,如果您提供无效的参数,aws-sdk-mock将自动引发错误。

即使您在SDK调用中调用.promise(),此操作也将起作用

根据评论,在将服务传递给函数时对其进行模拟:

AWS.mock('DynamoDB.DocumentClient', 'query', function(params, callback) {
  callback(new Error("Your error"));
});
相关问题