Интересно, что вы учитесь тестировать свой JS код:)
В декабре 2019 года в Vue Test Utils (v1) было критическое изменение . 0.0-beta.30), который отключил режим sync
. Это означает, что DOM не будет перерисовывать после каждого изменения, как мы привыкли с Vue framework. Я делюсь этим, потому что руководства / учебники, которые вы, возможно, прочитали, могут быть «устаревшими».
Всякий раз, когда мы тестируем изменения в DOM , мы должны вручную запускать повторное отдавая себя с wrapper.vm.$nextTick()
. Это изменение ускоряет наши тестовые наборы, поскольку оно предотвращает потенциальную мульти-рендеринг во время одного теста.
Итак! Вы были очень близки с этим:
fourthStar.trigger('click')
expect(fourthStar.classes()).toContain('active')
Однако, это должно быть так:
fourthStar.trigger('click')
await wrapper.vm.$nextTick()
expect(fourthStar.classes()).toContain('active')
Пожалуйста, помните: должна быть объявлена функция обратного вызова теста asyn c, чтобы разрешить ключевое слово await.
Я собрал полную копию + вставить дружественный компонент и протестируйте для вашего удобства:)
ClassComponent. vue
<template>
<button class="btn" :class="{active: isActive}" @click="isActive = ! isActive">Click me</button>
</template>
<script>
export default {
data(){
return {
isActive: false
}
}
}
</script>
ClassComponent.spe c. js
import {mount} from "@vue/test-utils";
import ClassComponent from "./ClassComponent";
it('applies active class when clicked', async () => {
const wrapper = mount(ClassComponent)
const button = wrapper.find('button')
expect(button.classes()).not.toContain('active')
button.trigger('click')
await wrapper.vm.$nextTick()
expect(button.classes()).toContain('active')
});
Обратите внимание на асинхронные / ожидающие ключевые слова