Коли слід використовувати візуалізацію та дрібну обробку в тестах Enzyme / React?


95

перед тим, як розмістити це запитання, я намагався шукати в sqa stackexchange, але там не знайшов жодного повідомлення про неглибоке та рендеринг, тому сподіваюся, хтось може мені тут допомогти.

Коли я повинен використовувати мілководді та візуалізувати для перевірки компонентів реагуючих речовин? Спираючись на документи airbnb, я зробив декілька думок щодо різниці двох:

  1. Оскільки дрібно тестує компоненти як одиницю , то їх слід використовувати для 'батьківських' компонентів. (наприклад, таблиці, обгортки тощо)

  2. Візуалізація призначена для дочірніх компонентів.

Причиною, що я задав це питання, є те, що мені важко розібратися, який з них я повинен використовувати (хоча документи говорять, що вони дуже схожі)

Отже, як я можу знати, який із них використовувати в конкретному сценарії?


2
Різниця між shallow () та mount () полягає в тому, що мілкий () тестує компоненти ізольовано від дочірніх компонентів, які вони надають, коли mount () заглиблюється і тестує дітей компонента. Для неглибоких () це означає, що якщо батьківський компонент надає інший компонент, який не вдасться відобразити, то неглибоке () візуалізація на батьківському рівні все одно пройде.
Шям Кумар

Відповіді:


160

Відповідно до документів Enzyme :

mount(<Component />) для повного візуалізації DOM ідеально підходить для випадків, коли у вас є компоненти, які можуть взаємодіяти з DOM apis, або може знадобитися повний життєвий цикл, щоб повністю протестувати компонент (тобто компонентDidMount тощо)

vs.

shallow(<Component />) для Рідкого відображення корисно обмежитися тестуванням компонента як одиниці та гарантувати, що ваші тести не опосередковано стверджують про поведінку дочірніх компонентів.

vs.

renderякий використовується для візуалізації компонентів реагування на статичний HTML та аналізу отриманої HTML структури.

Ви все ще можете бачити основні "вузли" в неглибокому візуалізації, тому, наприклад, ви можете зробити щось на зразок цього (злегка надуманого) прикладу, використовуючи AVA в якості бігуна spec:

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

Зауважте, що візуалізація , налаштування реквізиту та пошук селекторів та навіть синтетичні події підтримуються неглибоким візуалізацією, тому більшість разів ви можете просто використовувати це.

Але ви не зможете отримати повний життєвий цикл компонента, тому, якщо ви очікуєте, що щось станеться у компонентіDidMount, вам слід скористатися 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 => {

    // insert Test component here...

    const rendered = render(<Test />);
    const len = rendered.find('div').length;
    t.is(len, 1);
});

сподіваюся, що це допомагає!


1
Я все ще не отримую 100%, чому три дієслова приносять різні методи з ними. Наприклад, можна використовувати wrapper.getNode () неглибоко, але не у візуалізації. будь-які пояснення / посилання / документи / блоги, які допомагають мені отримати цей кінець?
Полкваппе

@HenryZhu слід зрозуміти з документів, що візуалізація є більш задіяною, ніж мілкою, оскільки вона насправді намагається імітувати дерево DOM для цього конкретного вузла компонентів
AGE

11
міграція ферментів з v2 на v3 зробила методи життєвого циклу за замовчуванням дрібними, а також github.com/airbnb/enzyme/blob/master/docs/guides/…
Абхінав Сінгі


9

Різниця між shallow () та mount () полягає в тому, що мілкий () тестує компоненти ізольовано від дочірніх компонентів, які вони надають під час mount (), заглиблюючись і тестуючи дітей компонента.

Для неглибоких () це означає, що якщо батьківський компонент надає інший компонент, який не вдасться відобразити, то неглибоке () візуалізація на батьківському рівні все одно пройде.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.