使用 redux-mock-store 进行单元测试 - 我怎样才能让这个单元测试通过?
Unit test with redux-mock-store - How can I make this unit test pass?
我刚开始使用 jest 和 enzyme。
我在进行单元测试时遇到了问题。
我正在使用 redux-mock-store 来模拟商店对象。
it('shows an li for each comment', () => {
expect(container.find('li').length).toBe(2);
});
我需要两个 li 元素,但我得到了 0 个 li 元素。
这个错误卡了很久
谁能帮我弄清楚如何通过这个测试!?
jest 测试运行器的测试结果
Error: expect(received).toBe(expected)
Expected value to be (using ===):
2
Received:
0
Expected :2
Actual :0
CommentList.test.js
import React, { Component } from 'react';
import { shallow, mount, render } from 'enzyme';
import configureStore from 'redux-mock-store';
import CommentList from '../../components/CommentList';
jest.unmock('../../components/CommentList');
describe('CommentList', () => {
const initialState = {comments: ['New Comment', 'Other New Comment']};
const mockStore = configureStore();
let store;
let container;
beforeEach(() => {
store = mockStore(initialState);
container = shallow(<CommentList store={store} />);
});
//This passes.
it('renders the connected component', () => {
expect(container.length).toBe(1);
});
//This fails.
it('shows an li for each comment', () => {
expect(container.find('li').length).toBe(2);
});
});
CommentList.js
import React, { Component } from 'react';
import { connect } from 'react-redux';
const propTypes = {};
const defaultProps = {};
const CommentList = (props) => {
const list = props.comments.map((comment) => {
<li key={comment}>{comment}</li>
});
return (
<ul className="comment-list">
{list}
</ul>
)
};
function mapStateToProps(state) {
return {
comments: state.comments
}
}
CommentList.propTypes = propTypes;
CommentList.defaultProps = defaultProps;
export default connect(mapStateToProps)(CommentList);
您可以导出未修饰的 CommentList 组件并通过仅传递评论道具进行测试,或者您可以尝试使用 Provider 包装 CommentList 组件并将商店传递给它。
<Provider store={store}>
<CommentList />
</Provider>
您可以在此处找到更多信息:
http://redux.js.org/docs/recipes/WritingTests.html#connected-components
为了使您的示例工作,您必须将列表更改为:
const list = props.comments.map(comment => (
<li key={comment}>{comment}</li>
));
我认为如果您在 beforeEach()
中使用 mount
而不是 shallow
渲染组件,它应该会像这样工作。
使用浅渲染,渲染器不会深入到显示您的 li
组件,因为树将是 connect(CommentList) -> CommentList -> ul -> li
如果需要,您还可以使用 dive
更深一层,以防您想保持浅层。在文档中查看:
http://airbnb.io/enzyme/docs/api/ShallowWrapper/dive.html
我刚开始使用 jest 和 enzyme。
我在进行单元测试时遇到了问题。 我正在使用 redux-mock-store 来模拟商店对象。
it('shows an li for each comment', () => {
expect(container.find('li').length).toBe(2);
});
我需要两个 li 元素,但我得到了 0 个 li 元素。
这个错误卡了很久
谁能帮我弄清楚如何通过这个测试!?
jest 测试运行器的测试结果
Error: expect(received).toBe(expected)
Expected value to be (using ===):
2
Received:
0
Expected :2
Actual :0
CommentList.test.js
import React, { Component } from 'react';
import { shallow, mount, render } from 'enzyme';
import configureStore from 'redux-mock-store';
import CommentList from '../../components/CommentList';
jest.unmock('../../components/CommentList');
describe('CommentList', () => {
const initialState = {comments: ['New Comment', 'Other New Comment']};
const mockStore = configureStore();
let store;
let container;
beforeEach(() => {
store = mockStore(initialState);
container = shallow(<CommentList store={store} />);
});
//This passes.
it('renders the connected component', () => {
expect(container.length).toBe(1);
});
//This fails.
it('shows an li for each comment', () => {
expect(container.find('li').length).toBe(2);
});
});
CommentList.js
import React, { Component } from 'react';
import { connect } from 'react-redux';
const propTypes = {};
const defaultProps = {};
const CommentList = (props) => {
const list = props.comments.map((comment) => {
<li key={comment}>{comment}</li>
});
return (
<ul className="comment-list">
{list}
</ul>
)
};
function mapStateToProps(state) {
return {
comments: state.comments
}
}
CommentList.propTypes = propTypes;
CommentList.defaultProps = defaultProps;
export default connect(mapStateToProps)(CommentList);
您可以导出未修饰的 CommentList 组件并通过仅传递评论道具进行测试,或者您可以尝试使用 Provider 包装 CommentList 组件并将商店传递给它。
<Provider store={store}>
<CommentList />
</Provider>
您可以在此处找到更多信息: http://redux.js.org/docs/recipes/WritingTests.html#connected-components
为了使您的示例工作,您必须将列表更改为:
const list = props.comments.map(comment => (
<li key={comment}>{comment}</li>
));
我认为如果您在 beforeEach()
中使用 mount
而不是 shallow
渲染组件,它应该会像这样工作。
使用浅渲染,渲染器不会深入到显示您的 li
组件,因为树将是 connect(CommentList) -> CommentList -> ul -> li
如果需要,您还可以使用 dive
更深一层,以防您想保持浅层。在文档中查看:
http://airbnb.io/enzyme/docs/api/ShallowWrapper/dive.html