【发布时间】:2017-03-11 05:53:56
【问题描述】:
我有一个简单的反应组件,它使用来自 antd 的 Card:
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 组件是否使用 Card
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>
再一次渲染后,我从渲染 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>
【问题讨论】:
-
connect是一个高阶组件,因此将Card包装在一个通用组件中。我认为shallow只会呈现第一级(这将是通用组件)。这个讨论可能有用:github.com/reactjs/redux/issues/1534 -
@DavinTryon,如果我扔掉所有 redux 部分(连接、存储等),只渲染反应组件(它单独导入):
shallow(<TBD pathname='my title' />),那么我再次得到结果@987654333 @.
标签: javascript reactjs redux react-redux enzyme