Jest ioredis mock - 将模拟绑定到模块

问题描述

在打字稿中,我有以下 IoRedis 实例。

import IoRedis from "ioredis";

const redis = new IoRedis({
    ...
});

通过以下方式在测试类中进行模拟。决定用ioredis-mock解决这个问题。

var IoRedis = require('ioredis-mock');
var ioRedis = new IoRedis({
    data: {
        ...
    },});
jest.mock('ioredis',ioRedis);

这会导致错误

TypeError: this._mockFactories.get(...) is not a function

我尝试了其他调用来模拟 ioredis,但是很难将模拟的测试版本绑定到我的代码中正在解析的版本。主要是我认为 new IoRedis 是罪魁祸首,但我的 javascript 经验不足以知道以哪种方式模拟导入/要求后跟 new 关键字。

解决方法

基于 es-6-class-mocks,我找到了一种有效的方法,在类上模拟构造函数。

var IoRedis = require('ioredis-mock');
var ioRedis = new IoRedis({
    data: {
        cacheKey: cacheData
    },});
jest.mock('ioredis',() => {
    return function () {
        return ioRedis
    };
});

此代码段可用于模拟 ioredis,我在文档或 Stackoverflow 中都找不到它。