sam*_*yst 1 node.js sinon aws-sdk
自 2016 年 3 月以来,javascript/nodejs 的 aws sdk 确实在 AWS.Request链接上提供了 .promise() 方法。
现在我正在 AWS.DynamoDB.DocumentClient(...).get() 方法(它返回一个 AWS.Request 对象)上运行一些单元测试,之后我也调用 .promise() 方法来接收一个 Promise。
现在,当我存根 .get() 方法时,我已经返回了一个 Promise,所以我希望 .promise() 方法只返回我现有的 Promise(通过“返回这个”)。
我的代码就像
var docClient = AWS.DynamoDB.DocumentClient(...)
docClient.get(...).promise().then(...)
Run Code Online (Sandbox Code Playgroud)
和我的测试文件
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
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用,我返回以下错误
类型错误:不能存根不存在的自己的财产承诺
我想我不知何故需要在我的假函数上声明一个 .promise 方法。
我试过这个:
this.protoype.promise = function(this){return this};
在我的假函数中,但这会抛出
类型错误:无法设置未定义的属性“承诺”
这里的问题是您将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})
}
};
});
Run Code Online (Sandbox Code Playgroud)