我正在使用Enzyme为React编写测试。
我的测试非常简单:
import OffCanvasMenu from '../index';
import { Link } from 'react-router';
import expect from 'expect';
import { shallow, mount } from 'enzyme';
import sinon from 'sinon';
import React from 'react';
describe('<OffCanvasMenu />', () => {
it('contains 5 <Link /> components', () => {
const wrapper = shallow(<OffCanvasMenu />);
expect(wrapper.find(<Link />)).to.have.length(5);
});
});
此代码基本上直接来自airbnb/enzyme docs,但返回错误:
FAILED TESTS:
<OffCanvasMenu />
✖ contains 5 <Link /> components
Chrome 52.0.2743 (Mac OS X 10.11.6)
TypeError: Cannot read property 'have' of undefined
我有点不清楚我与文档的做法有何不同。非常感谢任何指导。
答案 0 :(得分:24)
在他们的文档中,Enzyme正在使用Chai断言,因此如果您想使用expect(***).to.have.length(***)
,则需要安装chai-enzyme
并使用其expect
。因此,如果您使用Jest快照,它将导致expect(***).toMatchSnapshot()
出现问题,但此article将帮助您解决问题,因此您可以同时执行这两项操作。
答案 1 :(得分:15)
使用Link
代替<Link />
:
describe('<OffCanvasMenu />', () => {
it('contains 5 <Link /> components', () => {
const wrapper = shallow(<OffCanvasMenu />);
expect(wrapper.find(Link)).to.have.length(5);
});
});
它出现在airbnb / enzyme docs的第一个例子中:
it('should render three <Foo /> components', () => {
const wrapper = shallow(<MyComponent />);
expect(wrapper.find(Foo)).to.have.length(3);
});
答案 2 :(得分:6)
这可能是因为您没有在依赖项中安装chai断言库,或者没有将其导入测试文件中。因此,您需要安装chai-enzyme并将其导入您的测试文件,即
npm install chai
从&#39; chai&#39;;
导入{expect}
答案 3 :(得分:0)
如果您的括号错位,true
错误地放在.to.have
的括号内,则会发生此错误:
正确:
expect(...)
导致 TypeError:无法读取属性'have'of undefined :
expect(wrapper.find(<Link />)).to.have.length(5);