Макет провайдера контекста
Я пытаюсь проверить компонент, который использует контекст из компонента поставщика.
import { MuiPickersUtilsProvider } from 'material-ui-pickers';
import DateFnsUtils from '@date-io/date-fns';
render((
<MuiPickersUtilsProvider utils={DateFnsUtils}>
<App />
</MuiPickersUtilsProvider>
), document.getElementById('root'));
Я попытался установить контекст таким образом, но он все еще жалуется, что контекстные утилиты не найдены. AppTest
it('renders App Component', () => {
const context = { utils: DateFnsUtils };
const wrapper = shallow(<App/>, { context });
expect(wrapper.find(App)).toHaveLength(1);
});
Ошибка: Uncaught [Ошибка: не удается найти утилиты в контексте. Вы либо: а) забыли обернуть дерево компонентов в MuiPickersUtilsProvider; или б) смешанный именной и прямой импорт файлов. Рекомендация: используйте именованный импорт из индекса модуля.
2 ответа
Я поддерживаю material-ui-pickers
,
Действительно, как сказал @estus, необходимо обернуть дерево компонентов в MuiPickersUtilsProvider
, Поэтому я предлагаю создать свою собственную обертку вне мелководья, которая будет рендерить любые компоненты с контекстом. пример
const renderWithContext = (renderedNode) => render(
<MuiPickersUtilsProvider utils={DateFnsUtils}>
{renderedNode}
</MuiPickersUtilsProvider>
)
А потом в ваших тестах
renderWithContext(<App />)
Энзим context
вариант и setContext
Метод для унаследованного контекста.
Предполагается, что Context API должен быть смоделирован так же, как и в производстве. Учитывая, что MuiPickersUtilsProvider
использует контекстный API внутри, это:
const wrapper = shallow(
<MuiPickersUtilsProvider utils={DateFnsUtils}>
<App />
</MuiPickersUtilsProvider>
);
куда DateFnsUtils
может быть реальным или поддельным значением.
Желательно макетировать все ненужные модули в изолированных модульных тестах, включая сторонние модули. Сюда MuiPickersUtilsProvider
не будет необходимости