如何存根节点aws-sdk的.promise()方法

时间:2017-11-06 11:04:35

标签: node.js aws-sdk sinon

自2016年3月起,javascript / nodejs的aws sdk确实在AWS.Request link上提供了.promise()方法。

现在我正在AWS.DynamoDB.DocumentClient(...)上运行一些单元测试.get()方法 (返回一个AWS.Request对象),之后我也调用.promise()方法来接收Promise。

现在,当我存根.get()方法时,我已经返回了一个Promise,所以我希望.promise()方法除了返回现有的Promise之外什么都不做(通过“return this”)。

我的代码就像

var docClient = AWS.DynamoDB.DocumentClient(...)
docClient.get(...).promise().then(...)

和我的测试文件

var docClient = AWS.DynamoDB.DocumentClient(...)
var batchGetStub = sinon.stub(docClient, 'get').callsFake(function(){return Promise.resolve({id:1337})});
// now I need to also stub the .promise() method
var promiseStub = sinon.stub(docClient.get, 'promise').callsFake(functions(){return this}); // just return the promise back

这似乎不起作用,我收回了以下错误

  

TypeError:无法存根不存在的自有属性承诺

我想我在某种程度上需要在我的假函数上声明一个.promise方法。

我试过这个:

this.protoype.promise = function(this){return this};

在我的假函数中,但这会抛出

  

TypeError:无法设置未定义的属性'promise'

2 个答案:

答案 0 :(得分:3)

这里的问题是你将 get 函数视为返回一个承诺 - 事实并非如此。

get()返回一个对象,该对象上有一个名为 promise 的函数,在调用时会返回一个promise对象。

所以你真正需要做的是:

var docClient = AWS.DynamoDB.DocumentClient(...)
var batchGetStub = sinon.stub(docClient, 'get').callsFake(function(){
  return {
    promise: function () {
      return Promise.resolve({id:1337})
    }
  };
});

答案 1 :(得分:0)

Tristan在上面的答案中是正确的:get()函数调用不返回承诺,它返回一个对象,该对象上具有称为“ promise”的函数,调用该函数时应返回一个promise对象。 / p>

如果愿意,可以使用sinon,但在简单情况下,最好手动手动存入对象,如下所示:

const getStub = {
   get: (params) => ({
      promise: async () => ({id:1337}),
    })
  };

如果您使用Promise.resolve关键字,则不需要返回async,默认情况下,它将返回{id: 1337}对象作为已解决的承诺。

另一个注意事项:您正在将getbatchGet的术语混合在一起。这些是具有不同返回签名的不同dynamo文档客户端功能,因此请小心。祝你好运!