微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 sinon 存根存根类和方法

如何解决使用 sinon 存根存根类和方法

我需要使用 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();
                })

解决方法

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

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

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

,

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

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',})));

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?