使用“新”构造函数初始化对象时,Sinon Spy无法正常工作

时间:2018-07-19 14:25:23

标签: javascript node.js unit-testing mocha sinon

我需要一个间谍来检查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 是一个空数组。但是,当然不应该。

1 个答案:

答案 0 :(得分:0)

sandbox.stub(docClient,'put')docClient实例上对在test.js中定义的方法进行存根。由于它与index.js中使用的实例不同,因此存根方法无效。

原型方法可以在类原型上被监视或模拟,但这是特定于类实现的。 putDocumentClient的原型方法,因此可以使用。否则,整个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;