【TypeScript】使用jest正确导入ioredis-mock插件。or【TypeScript】在jest中正确导入ioredis-mock插件

首先

ioredis是Node.js中主要的Redis客户端包之一。
如果想要在单元测试等情况下模拟ioredis而不实际访问Redis服务器,可以使用ioredis-mock。

我认为在TypeScript中,很多人使用jest作为单元测试框架,但是在使用jest与ioredis-mock时,如果导入方式不正确,可能会在运行时出现错误。

因为我掉入了这个陷阱,所以在本篇文章中,我总结了在使用TypeScript+jest环境中,以正确和错误的方式导入ioredis-mock,以及相关错误信息的正确方法和错误方法,以便能够使用ioredis的类型信息。

验证环境

    • Node.js: 14.17.0

 

    • TypeScript: 4.3.5

 

    • ioredis: 4.27.7

 

    • ioredis-mock: 5.6.0

 

    jest: 27.0.6

正确的方法

我后悔没有好好阅读ioredis-mock存储库的README1,并且没有按照其中的方法去执行。

import Redis from 'ioredis';
jest.mock('ioredis', () => require('ioredis-mock/jest'));

错误的方法1

這是有關於使用在公式的GitHub上的型定義的問題所提到的方法2。
當在jest中使用時,會在特定狀況下引發錯誤。

import Redis from 'ioredis';
const RedisMock: typeof Redis = require('ioredis-mock');
jest.mock('ioredis');

错误内容如下:

TypeError: Cannot read property 'map' of undefined

这个错误发生在特定的命令执行时。虽然没有完全调查过,但通常在使用hset等哈希系列命令时会发生。
例如,在使用hset命令的以下代码中会发生该错误。

const redis = new RedisMock();
await redis.hset('aa', 'bb', 7);

两种错误的方法

上述的代码是将GitHub的Issue中提到的方法2与官方仓库的README1中提到的方法结合在一起。
在运行时,会出现上述代码中的导入部分出现错误。

import Redis from 'ioredis';
const RedisMock: typeof Redis = require('ioredis-mock');
jest.mock('ioredis', () => require('ioredis-mock/jest'));

错误内容如下。

TypeError: Cannot read property '_transformer' of undefined
除了 jest 之外,ioredis-mock 還有其他的配套(官方存儲庫)嗎?