Как вызвать событие нажатия на дочерний компонент в модульном тесте VueJS? - PullRequest
0 голосов
/ 09 марта 2020

У меня есть следующий Vue компонент:

<template>
    <div>
        <div>
            <year-btn @click="incrementYear"
                ref="increment-btn"/>
        </div>
    </div>
</template>

<script>
import yearBtn from "@/components/formInputs/yearBtn.vue";

export default {
    components: {
        "year-btn": yearBtn,
    },
    data() {
        return {
            monthAndYear: {
                year: 2000,
            },
        };
    },
    methods: {
        incrementYear() {
            this.monthAndYear.year++;
        },
    },
};
</script>

И у меня есть следующий Vue модульный тест.

it('test', async () => {
    wrapper = factory();

    wrapper.setData({
        monthAndYear: {
            year: 2020,
        },
    });

    wrapper.find({ ref: "increment-btn" }).trigger("click");
    await wrapper.vm.$nextTick();

    result = wrapper.vm.monthAndYear.year;
    expect(result).toEqual(2021);
});

К сожалению, вышеупомянутый тест не проходит, потому что щелчок событие в компоненте year-btn не может быть вызвано Vue Test Utils. Я знаю это, потому что, если я заменю свой шаблон следующим кодом, тест пройден.

<template>
    <div>
        <div>
            <button @click="incrementYear"
                ref="increment-btn"></button>
        </div>
    </div>
</template>

Мой вопрос заключается в том, как вызвать событие «click» для дочернего компонента (year- btn) что мой компонент использует?

Вот как выглядит компонент year-btn:

<template>
    <button @click="$emit('click')">
        Click me
    </button>
</template>

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Кажется вероятным, что factory() использует shallowMount, который заглушает свои дочерние компоненты. Переключитесь на mount, чтобы убедиться, что YearBtn действительно отображается.

0 голосов
/ 09 марта 2020

Если вы добавите console.log к incrementYear, вы увидите, что ref содержит объект компонента, а не элемент DOM.

    incrementYear() {
      this.monthAndYear.year++;
      console.log(this.$refs['increment-btn'])
    },

Поэтому попробуйте изменить это:

wrapper.find({ ref: "increment-btn" }).trigger("click");

на это:

wrapper.find({ ref: "increment-btn" }).$el.trigger("click");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...