我需要一个间谍来检查DynamoDb客户端(docClient)的'put'方法的参数。 我从没有间谍问题,但是在这种情况下,实例是由“新”构造函数创建的,而在dynamodb中称为“ put”方法存储参数时,以及当我检查间谍时,我的实例(docClient)都不会存根参数列表为空。
articles / index.js
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = async function handler() {
await docClient.put({
TableName: 'Articles',
Item: {
title: 'Title Example',
body: 'Body Example'
},
}).promise();
}
test.js
const AWS = require('aws-sdk');
const mochaPlugin = require('serverless-mocha-plugin');
const sandbox = require('sinon').createSandbox();
const docClient = new AWS.DynamoDB.DocumentClient();
const { expect } = mochaPlugin.chai;
let wrapped = mochaPlugin.getWrapper('articles', '/src/functions/articles/index.js', 'handler');
describe('Articles Tests', function ArticlesTests() {
afterEach(() => {
sandbox.restore();
});
it('should store correctly a data', async () => {
let docClientSpy = sandbox.stub(docClient,'put');
await wrapped.run();
const articleData = docClientSpy.args;
expect(articleData.TableName).to.be.equal('Articles');
})
})
articleData 是一个空数组。但是,当然不应该。
答案 0 :(得分:0)
sandbox.stub(docClient,'put')
在docClient
实例上对在test.js中定义的方法进行存根。由于它与index.js中使用的实例不同,因此存根方法无效。
原型方法可以在类原型上被监视或模拟,但这是特定于类实现的。 put
是DocumentClient
的原型方法,因此可以使用。否则,整个DocumentClient
都将被模拟,并且由于它是在index.js import上实例化的,因此会使测试变得复杂。
由于预计put()
具有promise()
方法,因此应模拟实现:
let promiseSpy = sandbox.stub().returns(Promise.resolve());
let docClientSpy = sandbox.stub(AWS.DynamoDB.DocumentClient.prototype, 'put').returns({ promise: promiseSpy });
...
expect(promiseSpy).to.have.been.called;