TypeError: Cannot read property 'contextTypes' of undefined
TypeError: Cannot read property 'contextTypes' of undefined
我正在尝试使用 Jest 测试 React 应用程序。我使用 Enzyme 的 shallow 在 App-test-js
中渲染我的 App.js
组件,但出现此错误:TypeError: Cannot read property 'contextTypes' of undefined
这是我的 App.js
:
/* global google */
import React, { Component } from 'react';
import Geosuggest from 'react-geosuggest';
import { getAirQuality } from './Client'
import DataTable from './DataTable'
import Errors from 'react-errors'
class App extends Component {
.
.
.
render() {
return (
<div className="App">
<form onSubmit={this.searchAirQuality.bind(this)}>
<Geosuggest
placeholder="Type a location and press SEARCH button!"
onSuggestSelect={this.onSuggestSelect.bind(this)}
initialValue={this.state.place}
location={new google.maps.LatLng(53.558572, 9.9278215)}
radius="20"/>
<button className="my-button" type="submit" disabled={!this.state.place}>Button</button>
</form>
<DataTable items={this.state.items} />
<Errors
errors={this.state.errors}
onErrorClose={this.handleErrorClose}
/>
</div>
)
}
}
export default App;
这是我的 App-test.js
:
import React from 'react'
import { shallow } from 'enzyme'
import App from '../components/App.js'
describe( '<App />', () => {
it('Button disable when input is empty', () => {
const App = shallow(<App />);
expect(App.find('.my-button').hasClass('disabled')).to.equal(true);
});
});
这是我 运行 npm test
:
时的错误
Terminal screenshot
这是我第一次开玩笑地测试,请问有人能帮我解决这个错误吗?
这里的问题是您正在使用浅层调用的结果重新定义应用程序组件
// Redefining
// ↓
const App = shallow(<App />);
解决方案是使用不同的名称:
// Use a different name
// ↓
const app = shallow(<App />);
如果您正在导入不存在的内容。
,这将是相同的错误TypeError: Cannot read property 'contextTypes' of undefined
这是一个例子:
AccountFormComponent.jsx
(不正确的 class 名称):
export class FoeFormComponent extends React.Component { .... }
AccountFormComponent.test.jsx
:
import { shallow } from 'enzyme'
import { expect, assert } from 'chai'
import { AccountFormComponent } from '../../src/components/AccountFormComponent';
describe('', function () {
it('', function () {
const enzymeWrapper = shallow(<AccountFormComponent {...props} />);
});
});
只需将以下内容添加到您的测试文件以确保该组件存在:
it('should exists', function () {
assert.isDefined(AccountFormComponent);
});
打印 AssertionError: expected undefined to not equal undefined
而不是
如@Ser 所述,可能是导入问题。
如果您正在使用 eslint 规则,如果任何导入可能失败,这可能会给您提示
"import/no-unresolved": 1,
我在尝试从 jsx 文件导入组件时遇到错误
import {Header} from './Header';
这修复了它
import {Header} from './Header.jsx';
另外,因为我使用了 webpack,我意识到我应该在 resolve.extensions 选项中添加“.jsx”。这样我就可以在导入时忽略扩展。
在我的例子中,错误发生在导入只有一个默认导出的模块时,但我使用的是单一导入。
所以而不是:
import { Foo } from './Foo'
使用:
import Foo from './Foo'
其中 Foo 具有默认导出:
class Foo extends Component {
render() {
return (<div>foo</div>)
}
}
export default Foo;
在我的例子中,我导入了一个具有命名组件语法的默认组件。
例如:
import {TestComponent} from "../../components/TestComponent";
而不是
import TestComponent from "../../components/TestComponent";
更新导入以使用正确的语法解决了这个问题。虽然很傻。
我正在尝试使用 Jest 测试 React 应用程序。我使用 Enzyme 的 shallow 在 App-test-js
中渲染我的 App.js
组件,但出现此错误:TypeError: Cannot read property 'contextTypes' of undefined
这是我的 App.js
:
/* global google */
import React, { Component } from 'react';
import Geosuggest from 'react-geosuggest';
import { getAirQuality } from './Client'
import DataTable from './DataTable'
import Errors from 'react-errors'
class App extends Component {
.
.
.
render() {
return (
<div className="App">
<form onSubmit={this.searchAirQuality.bind(this)}>
<Geosuggest
placeholder="Type a location and press SEARCH button!"
onSuggestSelect={this.onSuggestSelect.bind(this)}
initialValue={this.state.place}
location={new google.maps.LatLng(53.558572, 9.9278215)}
radius="20"/>
<button className="my-button" type="submit" disabled={!this.state.place}>Button</button>
</form>
<DataTable items={this.state.items} />
<Errors
errors={this.state.errors}
onErrorClose={this.handleErrorClose}
/>
</div>
)
}
}
export default App;
这是我的 App-test.js
:
import React from 'react'
import { shallow } from 'enzyme'
import App from '../components/App.js'
describe( '<App />', () => {
it('Button disable when input is empty', () => {
const App = shallow(<App />);
expect(App.find('.my-button').hasClass('disabled')).to.equal(true);
});
});
这是我 运行 npm test
:
Terminal screenshot
这是我第一次开玩笑地测试,请问有人能帮我解决这个错误吗?
这里的问题是您正在使用浅层调用的结果重新定义应用程序组件
// Redefining
// ↓
const App = shallow(<App />);
解决方案是使用不同的名称:
// Use a different name
// ↓
const app = shallow(<App />);
如果您正在导入不存在的内容。
,这将是相同的错误TypeError: Cannot read property 'contextTypes' of undefined
这是一个例子:
AccountFormComponent.jsx
(不正确的 class 名称):
export class FoeFormComponent extends React.Component { .... }
AccountFormComponent.test.jsx
:
import { shallow } from 'enzyme'
import { expect, assert } from 'chai'
import { AccountFormComponent } from '../../src/components/AccountFormComponent';
describe('', function () {
it('', function () {
const enzymeWrapper = shallow(<AccountFormComponent {...props} />);
});
});
只需将以下内容添加到您的测试文件以确保该组件存在:
it('should exists', function () {
assert.isDefined(AccountFormComponent);
});
打印 AssertionError: expected undefined to not equal undefined
而不是
如@Ser 所述,可能是导入问题。 如果您正在使用 eslint 规则,如果任何导入可能失败,这可能会给您提示
"import/no-unresolved": 1,
我在尝试从 jsx 文件导入组件时遇到错误
import {Header} from './Header';
这修复了它
import {Header} from './Header.jsx';
另外,因为我使用了 webpack,我意识到我应该在 resolve.extensions 选项中添加“.jsx”。这样我就可以在导入时忽略扩展。
在我的例子中,错误发生在导入只有一个默认导出的模块时,但我使用的是单一导入。
所以而不是:
import { Foo } from './Foo'
使用:
import Foo from './Foo'
其中 Foo 具有默认导出:
class Foo extends Component {
render() {
return (<div>foo</div>)
}
}
export default Foo;
在我的例子中,我导入了一个具有命名组件语法的默认组件。
例如:
import {TestComponent} from "../../components/TestComponent";
而不是
import TestComponent from "../../components/TestComponent";
更新导入以使用正确的语法解决了这个问题。虽然很傻。