我有简单的反应组件,使用来自antd的卡:
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { Card } from 'antd';
export class TBD extends Component {
constructor() {
super();
}
render() {
return (
<Card title={this.props.pathname}>
TODO
</Card>
);
}
}
export let select = (state) => {
return state.route;
};
export default connect(select)(TBD);
现在我写了一些简单的测试并想检查一下,我的TBD组件使用了卡
import React from 'react';
import {mount, shallow} from 'enzyme';
import {Provider, connect} from 'react-redux';
import {createMockStore} from 'redux-test-utils';
import {expect} from 'chai';
import chai from 'chai';
import chaiEnzyme from 'chai-enzyme';
chai.use(chaiEnzyme());
import { Card } from 'antd';
import TBDConnected, {TBD, select} from '../src/js/components/TBD';
describe('Fully Connected:', function () {
it('show selected item text', function () {
const expectedState = {route: {pathname: 'Menu1'}};
const store = createMockStore(expectedState);
const ConnectedComponent = connect(select)(TBDConnected);
const component = shallow(<ConnectedComponent store={store} />).shallow().shallow();
console.log(component.debug());
expect(component.equals(<Card/>)).is.equal(true);
});
});
它失败了,因为3浅浅的回报我
<Component title="Menu1">
TODO
</Component>
但我期待
<Card title="Menu1">
TODO
</Card>
经过一次渲染后,我从渲染卡中获得了纯粹的HTML我不明白为什么它将它呈现给Component而不是Card以及我如何得到我想要的结果。
简化我的问题的例子。下一次测试失败:
describe('TBD', function () {
it('Renders a Card', function () {
const component = shallow(<TBD />);
console.log(component.debug());
expect(component.equals(<Card/>)).is.equal(true);
});
});
在控制台中调试输出:
<Component title={[undefined]}>
TODO
</Component>
但我希望:
<Card title={[undefined]}>
TODO
</Card>
答案 0 :(得分:1)
您不需要测试整个连接组件。 我将首先测试表示纯组件(作为单元测试),然后您可以单独测试连接器。
即
import React from 'react';
import {shallow} from 'enzyme';
import {expect} from 'chai';
import chai from 'chai';
import chaiEnzyme from 'chai-enzyme';
chai.use(chaiEnzyme());
import { Card } from 'antd';
import {TBD} from '../src/js/components/TBD';
describe('TBD', function () {
it('Renders a Card', function () {
const component = shallow(<TBD />);
expect(component.equals(<Card/>)).is.equal(true);
});
it('sets the right title', function () {
const component = shallow(<TBD pathname="example" />);
expect(component.prop('title')).is.equal("example");
});
});
如您所见,您的纯组件必须作为纯函数进行测试。你传递一些道具并期待一些渲染。
然后,在测试连接器时,可以断言它正确映射了stateToProps和dispatchToProps ......
答案 1 :(得分:0)
Ant Delvelope组件中的问题。这些组件的一部分作为简单的匿名函数编写,没有扩展React.Component等。在结果中,Enzyme将其呈现为<Component />
,在浏览器中看起来像<StatelessComponent />
。