当使用Jest测试TypeScript和ioredis的代码时,报错指出需要使用构造函数

? TypeScript 和 ioredis 的源代码

如果你想在TypeScript中使用Redis,可以使用ioredis库编写代码,大致如下(顺便提一下,自从ES6引入Promise后,使用node_redis的遗留用户也变得很少)。

示例.ts

import * as Redis from 'ioredis';

(async () => {
  const redis = new Redis();
  const pong = await redis.ping(); // => PONG
})();

这段代码能够正确运行。

? Jest 测试代码

然而,我在 Jest 上编写的测试无法运行,结果陷入困境。

样本.spec.ts

import * as Redis from 'ioredis';

describe('Redis', () => {

  it('should be reply pong', async () => {
    const redis = new Redis();
    const pong = await redis.ping();
    redis.disconnect();
    expect(pong).toBe('PONG');
  })

});

因为需要直接执行.ts文件,所以安装了ts-jest。

$ jest
    TypeError: Redis is not a constructor

      4 |
      5 |   it('should be reply pong', async () => {
    > 6 |     const redis = new Redis();
        |                   ^
      7 |     const pong = await redis.ping();
      8 |     redis.disconnect();
      9 |     expect(pong).toBe('PONG');

      at Object.it (src/sample.spec.ts:6:19)

类型错误:Redis不是一个构造函数

为什么嘞

import * as Redis from 'ioredis';
const redis = new Redis();

尽管写法正确,但被告知不能是构造函数。

import Redis from 'ioredis';

修复后就能正常运行了。尽管明明是错误的。
嗯,也许是因为这样的原因,我曾经试图逃避现实,但当我将测试文件编译成.js文件并进行测试时,出现了错误。

    TypeError: ioredis_1.default is not a constructor

      4 | describe('Redis', () => {
      5 |     it('should be return pong', async () => {
    > 6 |         const redis = new ioredis_1.default();
        |                       ^
      7 |         const pong = await redis.ping();
      8 |         redis.disconnect();
      9 |         expect(pong).toBe('PONG');

      at Object.it (dist/sample.spec.js:6:23)

类型错误:ioredis_1.default 不是一个构造函数

? 原因是什么

似乎发现了ts-jest的一个错误,但是在问题追踪中找不到该问题。

"devDependencies": {
    "@types/ioredis": "^4.0.3",
    "@types/jest": "^23.3.5",
    "jest": "^23.6.0",
    "ts-jest": "^21.2.4",
    "typescript": "^3.1.3"
  }

当我将ts-jest升级到最新版本23.10.4时,问题解决了。

广告
将在 10 秒后关闭
bannerAds