Вот моя ситуация:
Я пытаюсь провести модульное тестирование компонента React (TodoList), который ничего не делает для метода Render, кроме сопоставления элементов и их отображения.
Он получает элементы (TodoItem) из магазина Redux с помощью MapStateToProps.
Это код JavaScript для компонента TodoList:
class TodoList extends React.Component {
onRemoveClick = (id) => {
diContainer.dataLayer.todo.remove(id);
}
render() {
const todos = this.props.todos;
if(!todos)
return null;
return (
todos.map(todo => (
<TodoItem key={todo.id} todo={todo} onRemove={this.onRemoveClick} />
))
);
}
}
const mapStateToProps = (state) => ({
todos: state.todos
});
export default connect(mapStateToProps)(TodoList);
Теперь я хочу проверить, что всякий раз, когда вызывается кнопка внутри TodoItem (дочерний объект), вызывается метод делегата onRemoveClick.
Я пытался использовать функцию насмешки, которую обеспечивает Jest, в сочетании с Enzyme. Однако, поскольку TodoList получает свои данные из Redux, я должен окружить мой вызов mount () Enzyme компонентом Provider и смоделировать хранилище.
Вот мой тестовый код:
import React from 'react';
import { mount } from 'enzyme';
import { Provider } from 'react-redux';
import configureStore from 'redux-mock-store';
import TodoList from '../../../../react/components/todo/TodoList';
describe('TodoList component', () => {
//global arrange
const storeState = {
todos: [
{
id: 'testId1',
title: 'testTitle1',
description: 'testDescription1'
},
{
id: 'testId2',
title: 'testTitle2',
description: 'testDescription2'
},
]
};
const mockStore = configureStore();
let store;
beforeEach(() => {
store = mockStore(storeState)
});
it('Removes a todo from the list if the remove button the todo was pressed', () => {
//arrange
//let mockFn = jest.fn();
//TodoList.prototype.onRemoveClick = mockFn; => tried, doesn't work...
const component = mount(
<Provider store={store}>
<TodoList />
</Provider>
);
//component.instance() => tried working with this, but couldn't find it
//component.instance().children() => is not the TodoList
const items = component.find('.todoItem');
//act
const button = items.first().find('button');
button.simulate('click');
//assert
//Todo: check function spy here
});
});
Я прокомментировал некоторые вещи, которые попробовал. Но я не могу получить доступ к компоненту TodoList в моем тестовом коде из-за обертки провайдера ...
Есть какие-нибудь подсказки?