Согласно документации по ферментам :
mount(<Component />)
для полного рендеринга DOM идеально подходит для случаев использования, когда у вас есть компоненты, которые могут взаимодействовать с API DOM или могут потребовать полного жизненного цикла для полного тестирования компонента (например, componentDidMount и т. д.)
vs.
shallow(<Component />)
для поверхностного рендеринга полезно ограничить себя тестированием компонента как единицы и гарантировать, что ваши тесты не подтверждают косвенно поведение дочерних компонентов.
vs.
render
который используется для визуализации компонентов реакции на статический HTML и анализа полученной структуры HTML.
Вы все еще можете видеть базовые «узлы» в неглубокой визуализации, поэтому, например, вы можете сделать что-то вроде этого (слегка надуманного) примера, используя AVA в качестве средства выполнения спецификации:
let wrapper = shallow(<TagBox />);
const props = {
toggleValue: sinon.spy()
};
test('it should render two top level nodes', t => {
t.is(wrapper.children().length, 2);
});
test('it should safely set all props and still render two nodes', t => {
wrapper.setProps({...props});
t.is(wrapper.children().length, 2);
});
test('it should call toggleValue when an x class is clicked', t => {
wrapper.setProps({...props});
wrapper.find('.x').last().simulate('click');
t.true(props.toggleValue.calledWith(3));
});
Обратите внимание, что рендеринг , установка свойств и поиск селекторов и даже синтетические события поддерживаются неглубоким рендерингом, поэтому в большинстве случаев вы можете просто использовать это.
Но вы не сможете получить полный жизненный цикл компонента, поэтому, если вы ожидаете, что что-то произойдет в componentDidMount, вы должны использовать mount(<Component />)
;
В этом тесте Sinon используется для наблюдения за компонентами.componentDidMount
test.only('mount calls componentDidMount', t => {
class Test extends Component {
constructor (props) {
super(props);
}
componentDidMount() {
console.log('componentDidMount!');
}
render () {
return (
<div />
);
}
};
const componentDidMount = sinon.spy(Test.prototype, 'componentDidMount');
const wrapper = mount(<Test />);
t.true(componentDidMount.calledOnce);
componentDidMount.restore();
});
Вышеупомянутое не пройдет с мелким рендерингом или рендерингом.
render
предоставит вам только html, так что вы все равно можете делать такие вещи:
test.only('render works', t => {
const rendered = render(<Test />);
const len = rendered.find('div').length;
t.is(len, 1);
});
надеюсь это поможет!