Тестирование v-слотов с помощью v-for -Jest / Vue

#javascript #vue.js #jestjs

#javascript #vue.js #jestjs

Вопрос:

Я пытаюсь выяснить, как протестировать мой компонент, в котором есть v-слот. Структура шаблона компонента:

Grid.vue

 <div> 
   <v-slot>
</div>
  

И когда я вызываю это, это что-то вроде:

 <Grid>
   <Column v-for="(element, index) in list" :key=index /> 
</Grid>
  

Пока у меня есть это :

 import { mount } from '@vue/test-utils';
import Grid from '~/components/Grid';
import GridColumn from '~/components/Column';

const columns = [
    {
        id: 'col1',
    },
    {
        id: 'col2',
    },
];

describe('Grid.vue', () => {
    const columnWrapper = {
        // render(h) {
        //     return columns.map(function (item) {
        //         return h('Column', item.id) })
        // }
        render(h) {
            return h(Column, { props: { index: 1, column: columns[0] } });
        }
    };

    const wrapper = mount(Grid, {
        slots: { columnWrapper }
    });
});
  

Я написал 2 способа рендеринга слотов для Grid . Второй вариант с return h(Column.... создает только один столбец. Как я мог бы отобразить список моделей columns = количество столбцов? Первый вариант / прокомментированный Я не уверен, хорошо ли я его написал — return h('Column' .... — это может быть неправильно.

Когда я консольный журнал, wrapper.vm.$el.children он HTMLCollection пуст. Столбцы не были добавлены в Grid . Кто-нибудь знает, что я делаю не так?

Комментарии:

1. v-slot это новая директива, а не встроенный компонент

Ответ №1:

На самом деле, неясно, чего вы хотите достичь с помощью этого теста, это выглядит сложным. Если вы хотите протестировать только Grid компонент или инициализировать его с помощью некоторых слотов, я рекомендую написать что-нибудь читаемое и избегать использования других компонентов:

 // example
const wrapper = mount(Grid, {
    slots: {
       default: columns.map(c => `<div class="foo">${c.id}</div>`)
    }
});

expect(wrapper.findAll('.foo').length).toBe(2)
  

Если вы хотите протестировать эту часть:

 // for example, GridUsage.vue
<Grid>
   <Column v-for="(element, index) in list" :key=index /> 
</Grid>
  

Итак, просто протестируйте компонент, в котором существует такое использование, это не ответственность Grid.vue

 // example part of test file
const columns = [
   {
      id: 'col1',
   },
   {
      id: 'col2',
   },
];
const wrapper = mount(GridUsage, { propsData: { list: columns  } });
expect(wrapper.findAll(Column).length).toBe(2)
  

И, конечно, должен быть отдельный тест для Column.vue

Документы: Тестовые утилиты Vue-Варианты монтажа-Слоты