LoginSignup
0
1

More than 1 year has passed since last update.

【TypeScript】jestでioredis-mockを正しくインポートする

Posted at

はじめに

ioredisはNode.jsにおける主要なRedisクライアントパッケージの一つです。
単体テスト等で、Redisサーバーに実際にアクセスすることなく実行するためにioredisをモック化したい場合には、ioredis-mockを使うことができます。

TypeScriptでは単体テストフレームワークとしてjestを使用することが多いと思いますが、jestioredis-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
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1