自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'
答案 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}
对象作为已解决的承诺。
另一个注意事项:您正在将get
和batchGet
的术语混合在一起。这些是具有不同返回签名的不同dynamo文档客户端功能,因此请小心。祝你好运!