【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 還有其他的配套(官方存儲庫)嗎?