Sinon 不能存根不存在的自己的属性“函数”

问题描述 投票:0回答:1

我正在尝试模拟一个模块

Database
,以便它的
getRecordDetails()
成员函数总是返回一些固定数据。见下文:

handler.js

const sinon = require("sinon");
const Database = require("../../lib/Database");
const database= new Database();

module.exports = {
  handler(event, context, callback) {
    event.Records.forEach(record=> {
       const recordDetails = database.getRecordDetails(record);
       // Do something with recordDetails
    });
  }
}
..

test.js

const sinon = require("sinon");
const db= require("../../lib/Database");
const lamdbda = require("../../lib/lambda.js");

describe("Test suite", () => {
  it("invoke lambda",  done => {
    lambda.handler(data, {}, (err, data) => {
      sinon.stub(db, "getRecordDetails").withArgs(sinon.match.any).returns("{id: 1}");
      ...
    }
  }

}

数据库.js

class Database {
  constructor() {
    this.dynamdbClient = new AWS.DynamoDB.DocumentClient();
  }

  getRecordDetails(record) {
    const param = {
      TableName: ..
      Key: {
        uuid: record.uuid
        ...
     }
    }
    const dbRecord = await docClient.get(params).promise();
    return mapToRecordDetails(dbRecord); // new object mostly 1-1 mappings.
  }

}

但我得到:

TypeError: Cannot stub non-existent own property getRecordDetails 我做错了什么?

javascript node.js aws-lambda sinon sinon-chai
1个回答
0
投票

getRecordDetails
方法是您的
Database
类的实例方法。尝试
sinon.stub(Database.prototype, 'getRecordDetails')
.

例如

handle.js

const Database = require('./database');
const database = new Database();

module.exports = {
  handler(event, context, callback) {
    event.Records.forEach((record) => {
      const recordDetails = database.getRecordDetails(record);
      console.log("🚀 ~ file: handler.js:8 ~ event.Records.forEach ~ recordDetails:", recordDetails)
    });
  },
};

database.js

const AWS = require('aws-sdk');

class Database {
  constructor() {
    this.dynamdbClient = new AWS.DynamoDB.DocumentClient();
  }

  async getRecordDetails(record) {
    const param = {
      TableName: 'a',
      Key: {
        uuid: record.uuid,
      },
    };
    return docClient.get(params).promise();
  }
}

module.exports = Database;

handler.test.js

const sinon = require('sinon');
const Database = require('./database');
const lamdbda = require('./handler.js');

describe('Test suite', () => {
  it('invoke lambda', () => {
    sinon.stub(Database.prototype, 'getRecordDetails').returns('{id: 1}');
    lamdbda.handler({ Records: [1] }, {}, (err, data) => {});
  });
});

测试结果:

  Test suite
🚀 ~ file: handler.js:8 ~ event.Records.forEach ~ recordDetails: {id: 1}
    ✓ invoke lambda


  1 passing (4ms)
© www.soinside.com 2019 - 2024. All rights reserved.