繁体   English   中英

模拟DynamoDB Documentclient的承诺

[英]Mocking promise from DynamoDB Documentclient

所以我正在运行一些单元测试,我希望基本上保留这个承诺,以便在我需要它时解析或拒绝。 这是我的代码的样子。

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()

    })
})

您可以使用aws-sdk-mock通过自定义响应模拟DynamoDB DocumentClient。

要模拟成功的响应,您可以:

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

要模拟错误,您可以简单地执行:

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

请记住,如果提供无效参数,aws-sdk-mock将自动抛出错误,这是一个很好的功能。

即使您在SDK调用上调用.promise(),这也会有效

根据评论,模拟服务何时传递给函数:

var AWS = require("aws-sdk");
var AWS_mock = require("aws-sdk-mock");

describe('App function tests', ()=>{
  test('getStatusForPromiseID', ()=>{
    AWS_mock.mock('DynamoDB.DocumentClient', 'query', function(params, callback) {
      callback(null, {Items: [1, 2, 3]});
    });

    let docClient = new AWS.DynamoDB.DocumentClient();

    return getStatusForPromiseID('11011', docClient)
      .then(result => {
            expect(result).to.equal({Items: [1, 2, 3]});
        });
  })
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM