【问题标题】:why jest mocked function returns undefined?为什么开玩笑的模拟函数返回未定义?
【发布时间】:2021-10-01 16:11:08
【问题描述】:

我有一个要测试的 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. 通过示例帮助我了解差异。

【问题讨论】:

  • @slideshowp2 你能帮我吗

标签: javascript jestjs ts-jest


【解决方案1】:

请帮助我理解为什么我不能模拟 getEnvironment 函数 正确吗?

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

更多详情请参考official documentation

确保您模拟 kafkaBrokers 并查找“testBrokers”以获取预期结果

brokers: kafkaBrokers[getEnvironment()]

模拟默认导入函数和 模拟一个命名的导入函数?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2022-10-24
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多