はじめに
ioredis
はNode.jsにおける主要なRedisクライアントパッケージの一つです。
単体テスト等で、Redisサーバーに実際にアクセスすることなく実行するためにioredis
をモック化したい場合には、ioredis-mock
を使うことができます。
TypeScriptでは単体テストフレームワークとしてjest
を使用することが多いと思いますが、jest
でioredis-mock
を使用する際には、そのインポート方法を誤ると実行時にエラーが発生してしまします。
私はこれに引っかかってしまったので、本記事では、TypeScript+jest
を使用している環境において、ioredis
の型情報を利用できる形でioredis-mock
をインポートする際の、正しい方法と誤った方法、そのエラー内容についてまとめています。
検証環境
- 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に記載されている方法です。
ちゃんとREADMEを読んで素直にこの方法に従わなかった自分を恨みます。
import Redis from 'ioredis';
jest.mock('ioredis', () => require('ioredis-mock/jest'));
誤った方法1
公式のGitHubにある型定義の利用についてのIssueに書かれている方法2です。
jest
で使うと後述する特定の状況でエラーが発生します。
import Redis from 'ioredis';
const RedisMock: typeof Redis = require('ioredis-mock');
jest.mock('ioredis');
エラーの内容は以下の通りです。
TypeError: Cannot read property 'map' of undefined
このエラーは特定のコマンド実行時に発生します。全て調べたわけではないですが、hset
等のHash系のコマンドで発生することが多いです。
例えば、hsetコマンドを利用した以下のコードで発生します。
const redis = new RedisMock();
await redis.hset('aa', 'bb', 7);
誤った方法2
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