我该如何用柴期望值替换Jext期望值类型?

时间:2019-04-13 03:57:48

标签: typescript jestjs chai

我想使用Chai而不是Jest作为断言库。我使用打字稿,我想用Chai Expect类型代替global Jest Expect。

我尝试做类似的事情:

import chai from "chai";

type ChaiExpect = typeof chai.expect;

declare global {
  export const expect: ChaiExpect;
}

global.expect = chai.expect;

但是打字稿抱怨是因为:

Cannot redeclare block-scoped variable 'expect'.ts(2451)
index.d.ts(39, 15): 'expect' was also declared here.

如何覆盖在玩笑的index.d.ts中声明的类型?

1 个答案:

答案 0 :(得分:2)

您可以在JavaScript方面(在打字稿方面)重新分配global.expect的运行时值。

Jest将expect声明为全局变量(请参见@types/jest/index.d.ts(39, 15))。当前,打字稿无法提供在同一块范围内覆盖已声明的变量类型的方法

只要您保持@types/jest/index.d.ts的状态,就无法采取任何措施来抑制该错误。


解决方案

1。简单的方法

使用chai的expect的最简单方法是简单地将其导入并在每个.test.ts文件中使用:

// sum.test.ts
import { expect } from 'chai'
import { sum } from './sum';

test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).eq(3)
});

2。艰难的方式

现在,如果您真的不能忍受重复的import { expect } from 'chai'行,这是更困难的路径:

  1. node_modules/@types/jest移至types/jest,确保已将其移至node_modules文件夹中。还要从“ package.json => devDependencies”中删除“ @ types / jest”。

  2. 修改types/jest/index.d.ts,将expect的类型替换为chai。您需要将此自定义类型声明提交到git repo。

// index.d.ts

+ /// <reference types="chai" />

- declare const expect: Expect
+ declare const expect: Chai.ExpectStatic
  1. 在您的tsconfig.json中,添加:
{
  "compilerOptions": {
    "typeRoots": ["node_modules/@types", "types"],
    ...
}
  1. 创建jestSetup.js并添加此单行代码:
global.expect = require("chai").expect
  1. jest.config.js中,设置:
setupFilesAfterEnv: ['./jestSetup.js'],
// or `setupTestFrameworkScriptFile` for older version.

你去了。现在,您可以在全局范围内直接使用chai expect