找不到酶适配器react 16 的声明文件?

IT技术 reactjs typescript testing enzyme
2021-05-02 13:11:31

一段时间以来,我一直在使用 Enzyme 来测试我的 React 应用程序中的组件。在几周内第一次更新我的软件包后,我的测试开始出现错误。

 FAIL  src/__tests__/title.test.ts
  ● Testing title component › renders
Enzyme Internal Error: Enzyme expects an adapter to be configured, but found none. [...] 
To find out more about this, see http://airbnb.io/enzyme/docs/installation/index.html

我继续'enzyme-adapter-react-16'按照链接中的描述进行安装,并将以下几行添加到我的测试文件中:

import * as enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
enzyme.configure({ adapter: new Adapter() });

但是,由于我的应用程序是用 TypeScript 编写的,我现在遇到了两个新问题。

错误1 错误2

为了澄清图像,第一个错误 TS7016 是没有任何类型的enzyme-adapter-react-16,而第二个错误 TS2339 表示enzyme没有属性configure

我对 TypeScript 比较陌生,所以我需要一些帮助。我试图安装类型,enzyme-adapter-react-16但那些似乎不存在。

我应该尝试自己添加它们,还是有什么方法可以避免这个问题?

也很好奇是什么导致这个错误出现。我以前不需要适配器,为什么现在?

4个回答

我应该尝试自己添加它们,还是有什么方法可以避免这个问题?

我相信您是正确的,目前没有类型enzyme-adapter-react-16- 它很新,所以似乎还没有人创建任何类型。

您可以自己创建它们,如果您认为它们定义得很好,您可以将它们贡献给绝对类型化以供其他人使用。为了“避免”这个问题,你可以让 TypeScript 忽略它没有类型信息的事实。

要忽略类型错误:

  • 对于第一个错误,错误消息试图帮助“添加新声明 (.d.ts) 文件...”。所以,你可以创建一个文件(我通常把它放在一个名为“/types”的文件夹中),名为enzymeAdapter.d.ts,并制作内容declare module 'enzyme-adapter-react-16';(来自错误消息)。这基本上告诉typescript将导入的对象视为any类型(即没有类型检查)。

  • 对于第二个错误,您可以将enzyme导入转换为any,然后调用configure. 例如:(enzyme as any).configure({ adapter: new Adapter() });如果 tslint 抱怨使用any,您可以让它忽略// tslint:disable-next-line:no-any上面带有注释的那一行

完整代码:

import * as enzyme from 'enzyme';
import * as Adapter from 'enzyme-adapter-react-16';

// tslint:disable-next-line:no-any
(enzyme as any).configure({ adapter: new Adapter() });

也很好奇是什么导致这个错误出现。我以前不需要适配器,为什么现在?

这是enzyme版本 3 项目的新设计选择- 您可以在此处阅读有关版本 2.x 的主要更改的详细信息我认为适配器方法是为了更容易和更一致地处理支持不同版本react的不同要求。

如果您使用的是 React 16+ 并已弹出您的应用程序,请添加以下包:

yarn add enzyme react-test-renderer enzyme-adapter-react-16 --dev

然后你必须通过创建文件 src/setupTests.js 来设置 Enzyme。添加这个:

import React from 'react';
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';

configure({ adapter: new Adapter() });

最后你必须修改 package.json - 添加/src/setupTests.js到 setupFiles 数组:

"setupFiles": [
  "<rootDir>/config/polyfills.js",
  "<rootDir>/src/setupTests.js"
],

修改 setupFiles 数组

之前: 截图之前

之后: 截图之后

我想我们都同意绿色是一种可爱的颜色!!

花了我太长时间才解决。希望这有助于某人:

使用 Create-React-App 2.1.3 和酶 3.8.0,酶适配器react 16:1.7.1,酶到 json 23.6.0

我的解决方案:

src/setupTests.js :

import Enzyme, { configure } from "enzyme";
import Adapter from "enzyme-adapter-react-16"


configure({ adapter: new Adapter() });

然后在你想用酶和笑话测试的组件中:

import React from "react";
import Enzyme from "enzyme";
import Component from "./component";

const { shallow } = Enzyme; //whatever you want to use here



test("component exists", () => {
  expect(Component).toBeDefined();
});

//这不是必需的,但只是为了完整起见——没有其他配置发生:

包.json:

"jest": {
    "snapshotSerializers": ["enzyme-to-json/serializer"]
      }

您应该为typescript添加其类型。你可以使用这个 npm 包:

npm i @types/enzyme-adapter-react-16 --save-dev