使用 sinon 存根存根类和方法

时间:2021-03-12 13:25:09

标签: javascript node.js sinon sinon-chai

我需要使用 sinon msk 客户端函数 connect() 和 send() 或 sendmessage() 进行存根的帮助。尝试了多种方法,但它仍然调用了实际的函数。请帮忙

这里是文件中的代码片段。

index.js

var KafkaConnection = require('./mskclient');
                var kafkaObj = new KafkaConnection(key.User, key.Secret);
            var res = await kafkaObj.connectProducer(event.body);

mskclient.js

class KafkaConnection {
  constructor(user, secret) {
    this.connection = new Kafka({
      authenticationTimeout: 5000,
      clientId: client_id,
      brokers: brokerlist.split(','),
      ssl: true,
      sasl: {
        mechanism: 'scram-sha-512',
        username: user,
        password: secret,
      },
    });
    this.producer = null;
  }

  async sendMessage(msgObj) {
    console.log('sendMessage');
    this.producer = this.producer || this.connection.producer();
    await this.producer.connect();
    await this.producer.send(msgObj);
  }

  async disconnect() {
    this.producer && (await this.producer.disconnect());
  }

  async connectProducer(event) {
    try {
      log.info('Sending Message');
      console.log('connectProducer');

      await this.sendMessage({
        topic: process.env.TOPIC_NAME,
        acks: 1,
        messages: [
          {
            key: 'test-key',
            value: JSON.stringify(event),
          },
        ],
      });
      await this.disconnect();
      log.info('Successfully sent message');
      return 0;
    } catch (e) {
      log.info('Message not sent to kafka..');
      log.error(e);
      await this.disconnect();
      return 1;
    }
  }
}

module.exports = KafkaConnection;

到目前为止,我尝试了以下方法,但它们都被称为 kafka 实际函数而不是存根

方法#1

const service = require('../index');
const KafkaConnection = require('../mskclient');

var kafkaObj = sinon.createStubInstance(KafkaConnection);

var res1 = service.handler(event).then(function () {
                       done();
                }).catch((error) => {
                    done();
                })

方法#2

const service = require('../index');
const KafkaConnection = require('../mskclient');

//var kafkaObj = sinon.createStubInstance(KafkaConnection);
   SMSStub = sinon.stub(KafkaConnection.prototype, 'KafkaConnection').callsFake(() => {
                return 1
            });

var res1 = service.handler(event).then(function () {
                       done();
                }).catch((error) => {
                    done();
                })

2 个答案:

答案 0 :(得分:1)

您好,根据我对您问题的理解,我认为这就是您要查找的内容:

sinon.stub(KafkaConnection.prototype, 'connectProducer').callsFake(() => {
  return 1;
})
sinon.stub(KafkaConnection.prototype, 'sendMessage').callsFake(() => {})

sinon.stub 的第二个参数应该是您要模拟的函数的名称。

答案 1 :(得分:1)

首先在自己的导入连接类上独立服务。

const service = require('../index'); // <-- import '../mskclient' and create obj
const KafkaConnection = require('../mskclient');

即使你交换它们

const KafkaConnection = require('../mskclient');

const kafkaObj = sinon.createStubInstance(KafkaConnection);

const service = require('../index'); // <-- it is still importing the original mskclient

https://sinonjs.org/how-to/stub-dependency/ 开始,如果您真的想存根依赖项,则必须导出一个可变对象:

// mskclient.js
module.exports = {
  KafkaConnection: class KafkaConnection {},
};

// service.js
const mod = require('./mskclient');

module.exports = function run() {
  const conn = new mod.KafkaConnection();
  conn.doSomething();
}

但是如果您使用 jest,您可以

jest.mock('../mskclient');
// or
jest.mock('../mskclient', () => jest.fn(() => ({
  connectProducer: jest.fn(),
})));

const service = require('../index'); // <-- import '../mskclient' and create obj
const KafkaConnection = require('../mskclient');

// es6
import service from '../';
import KafkaConnection from '../mskclient';

jest.mock('../mskclient', () => jest.fn(() => ({
  connectProducer: jest.fn(),
})));

见:https://jestjs.io/docs/next/es6-class-mocks#automatic-mock