【问题标题】:How to fix this Jest error: "component encountered a declaration exception"?如何修复此 Jest 错误:“组件遇到声明异常”?
【发布时间】:2019-03-21 03:57:44
【问题描述】:

我正在尝试使用 Jest 和 Enzyme 测试 React 组件。目前我的测试非常简单,我只是想确保组件挂载:

import React from 'react';
import Enzyme, { shallow } from 'enzyme';
import EnzymeAdapter from 'enzyme-adapter-react-16';
import App from './App';

Enzyme.configure({
  adapter: new EnzymeAdapter()
});

describe('App Component', () => {
  const app = shallow(<App />);

  it('renders successfully', () => {
    expect(app).toMatchSnapshot();
  });
});

运行它会出现以下错误:

App Component › encountered a declaration exception
TypeError: window.TimerSDK is not a constructor

有问题的违规行是这段代码:

this.timerSDK = new window.TimerSDK({ accessToken: token });

TimerSDK 是第三方脚本,通过index.html 中的脚本标签加载。它不像 es6 模块那样导入。

上面的代码在实际使用应用程序时在浏览器中运行良好,但在运行测试时出错。

如何解决这个问题?

【问题讨论】:

  • 不相关,但如果您创建带有回调的 todo 测试,Jest 也会咳出这个“遇到声明异常”错误:“错误:必须仅使用描述调用 Todo。”跨度>

标签: javascript reactjs jestjs enzyme


【解决方案1】:

Jest 的默认test environmentjsdom 提供的类似浏览器的环境,它提供了一个模拟的window,它也是global 对象。

您可以在第三方脚本上调用require 以获取其导出,并在测试开始时将其设置为global(或window)(或者在setupFilesAfterEnv 设置模块中执行此操作,如果每次测试都需要它):

global.TimerSDK = require('path-to-script');  // <= set the module exports on global
import React from 'react';
import Enzyme, { shallow } from 'enzyme';
import EnzymeAdapter from 'enzyme-adapter-react-16';
import App from './App';

Enzyme.configure({
  adapter: new EnzymeAdapter()
});

describe('App Component', () => {
  const app = shallow(<App />);

  it('renders successfully', () => {
    expect(app).toMatchSnapshot();
  });
});

【讨论】:

  • 组件没有修改窗口对象,它只是调用TimerSDK对象上的方法。你所说的在测试中导入脚本是有道理的,但不幸的是这样做并不能消除错误:(
  • @TK123 什么是第三方库?我会看看它是如何工作的并更新我的答案
  • 啊,谢谢你的帮助,但它是内部的,所以我不能发布它,“TimerSDK”是一个占位符谎言大声笑我只能说它是用 requireJS 模块语法编写的,不知道还有很多关于它的一切都被缩小了。也许这就是问题所在,因为我注意到脚本无法在不引发错误的情况下导入常规组件(因此我首先将其加载为脚本标记)。所以也许在测试中导入它也失败了......
  • @TK123 gotcha,我已经使用 requireJS 模块语法更新了我的脚本答案
猜你喜欢
  • 2014-05-06
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2017-03-03
相关资源
最近更新 更多