为什么开玩笑地嘲笑函数 returns 未定义?

why jest mocked function returns undefined?

我有一个要测试的 js 文件。

'use strict';
const KafkaJS = require('kafkajs');
const { Kafka, logLevel } = require('kafkajs');
const kafkaLogger = require('./kafkaLogger');
const { kafkaBrokers } = require('../config/kafkaConfig');
const secretConfig  = require('../config/secret');
const  { getEnvironment }= require('../utils/getEnvironment');
const fs = require('fs');


const kafkaClient = new Kafka(
  {
    brokers: kafkaBrokers[getEnvironment()],
    clientId: 'api',
    connectionTimeout: 20000,
    logCreator: kafkaLogger,
    logLevel: logLevel.DEBUG,
    retry: {
      initialRetryTime: 100,
      retries: 8
    },

    ssl: {
      rejectUnauthorized: false,
      ca: [fs.readFileSync('/etc/secrets/RootCA-SHA256.pem', 'utf-8')],
      key: [fs.readFileSync('/etc/secrets/keystore.pem', 'utf-8')],
      cert: [fs.readFileSync('/etc/secrets/trust.pem', 'utf-8')],
      passphrase: secretConfig.kafka_keystore_password

  }

  },
);


module.exports = kafkaClient;

我正在编写测试用例作为..

const KafkaJS = require('kafkajs');
const { Kafka, logLevel } = require('kafkajs');
const kafkaLogger = require('./kafkaLogger');
const { getEnvironment } = require('../utils/getEnvironment');
const fs = require('fs');


jest.mock('../utils/getEnvironment', () => {
  return {
    getEnvironment: jest.fn().mockResolvedValue('testBrokers'),
  };
});
getEnvironment.mockResolvedValue('testBrokers')
jest.mock('fs')
fs.readFileSync.mockReturnValue("cert")
process.env.ENVIRONMENT = 'dev';
jest.mock('kafkajs');




const mockProducer = jest.fn();
const mockConsumer = jest.fn();

KafkaJS.Kafka.mockImplementation((options) => {
  expect(options).toEqual({
    brokers: 'testBrokers',
    clientId: 'api',
    connectionTimeout: 20000,
    logCreator: kafkaLogger,
    logLevel: logLevel.DEBUG,
    retry: {
      initialRetryTime: 100,
      retries: 8
    },

    ssl: {
      rejectUnauthorized: false,
      ca: ["cert"],
      key: ["cert"],
      cert: ["cert"],
      passphrase: "cert"

  }
  });
  return { producer: mockProducer, consumer: mockConsumer };
});


const kafkaClient = require('./client');

describe('kafka client', () => {
  it('should return a client', async () => {
    expect(kafkaClient).toEqual({
      producer: mockProducer,
      consumer: mockConsumer,
    });
  });
});

我开玩笑地收到以下错误..

FAIL  src/kafka/client.test.js
  ● Test suite failed to run

    expect(received).toEqual(expected) // deep equality

    - Expected  - 1
    + Received  + 1

    @@ -1,7 +1,7 @@
      Object {
    -   "brokers": "testBrokers",
    +   "brokers": undefined,
  1. 请帮助我理解为什么我不能模拟 getEnvironment 函数 正确吗?
  2. 模拟默认导入有什么区别吗 函数并模拟命名的导入函数 ?
  3. 通过示例帮助我理解差异。

please help me understand why i cannot mock getEnvironment function properly ?

在测试文件中,将 getEnvironment.mockResolvedValue('testBrokers') 替换为 getEnvironment.mockReturnValue('testBrokers'),因为前者用于模拟异步函数。

参考official documentation了解更多详情

确保模拟 kafkaBrokers 查找“testBrokers”以及预期结果

brokers: kafkaBrokers[getEnvironment()]

is there any difference in mocking a default imported function and mocking a named imported function ?

理想情况下,嘲笑他们没有区别。请参阅 this 有趣的笑话功能以获得更多见解。