Kiedy należy stosować render i shallow w testach enzymatycznych / reakcyjnych?

Przed wysłaniem tego pytania, próbowałem szukać w SQA stackexchange, ale nie znalazłem posta o shallow i render tam, więc mam nadzieję, że ktoś może mi pomóc tutaj.

Kiedy powinienem używać shallow i renderować w testowaniu komponentów reactowych? Bazując na dokumentach airbnb, zrobiłem kilka opinii na temat różnicy między nimi:

  1. Ponieważ shallow testuje komponenty jako jednostkę, więc powinien być używany Dla komponentów "macierzystych". (ex. Stoły, Owijki, itd.)

  2. Render jest przeznaczony dla komponentów potomnych.

Powodem, dla którego zadałem to pytanie, jest to, że mam trudności z wymyśleniem, którego z nich powinienem użyć (choć dokumenty mówią, że są bardzo podobne)

Więc skąd mam wiedzieć, który z nich użyć w konkretnym scenariuszu?

Author: 4m1r, 2016-08-02

2 answers

Zgodnie z enzym docs :

mount(<Component />) pełne renderowanie DOM jest idealne dla przypadków użycia, w których masz komponenty, które mogą wchodzić w interakcje z API DOM lub mogą wymagać pełnego cyklu życia, aby w pełni przetestować komponent (np. componentDidMount itp.)

Vs.

shallow(<Component />) ponieważ płytkie renderowanie jest przydatne, aby ograniczyć się do testowania komponentu jako jednostki i upewnić się, że testy nie są pośrednio potwierdzające zachowanie dziecka komponenty.

Vs.

render który jest używany do renderowania komponentów reactowych do statycznego HTML i analizy wynikowej struktury HTML.

Nadal możesz zobaczyć podstawowe "węzły" w płytkim renderowaniu, więc na przykład możesz zrobić coś takiego (nieco wymyślonego) przykład używając AVA jako Spec runner:

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));
});

Zauważ, że renderowanie, ustawianie rekwizytów i znajdowanie selektorów a nawet syntetycznych zdarzenia są obsługiwane przez płytkie renderowanie, więc większość razy można po prostu z niego korzystać.

Ale nie będziesz w stanie uzyskać pełnego cyklu życia komponentu, więc jeśli spodziewasz się, że coś się wydarzy w componentDidMount, powinieneś użyć mount(<Component />);

Ten test wykorzystuje Sinon do szpiegowania komponentów 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();
});

Powyższe nie przejdzie z shallow rendering lub render

render dostarczy Ci tylko html, więc nadal możesz to zrobić takie rzeczy:

test.only('render works', t => {

    // insert Test component here...

    const rendered = render(<Test />);
    const len = rendered.find('div').length;
    t.is(len, 1);
});
Mam nadzieję, że to pomoże!
 115
Author: 4m1r,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 15:45:21

Różnica pomiędzy shallow () i mount() polega na tym, że shallow()testuje komponenty w izolacji od komponentów potomnych, które renderują, podczas gdy mount () przechodzi głębiej i testuje komponenty potomne. Dla shallow() oznacza to, że jeśli komponent macierzysty renderuje inny komponent, który nie jest renderowany, to renderowanie shallow () na rodzicu nadal przejdzie.

 0
Author: Shyam Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-10 07:00:32