Я не уверен, что это решение идеально, но это работает для моего случая.
Здесь работают два ключевых принципа.
1) Создайте задержку на основе по запросуAnimationFrame:
const waitRAF = () => new Promise(resolve => requestAnimationFrame(resolve));
2) Сделать анимацию, которую я тестирую, очень быстрой:
В моем случае анимация, на которой я ждал, имеет настраиваемая длительность, которая установлена в 1 в моих данных props.
Другим решением этой проблемы может быть запуск метода waitRaf несколько раз, но это замедлит тестирование.
Вы также можете нужно смоделировать requestAnimationFrame, но это зависит от вашей настройки, среды тестирования и реализации
Мой пример тестового файла (Vue приложение с Jest):
import { mount } from '@vue/test-utils';
import AnimatedCount from '@/components/AnimatedCount.vue';
const waitRAF = () => new Promise(resolve => requestAnimationFrame(resolve));
let wrapper;
describe('AnimatedCount.vue', () => {
beforeEach(() => {
wrapper = mount(AnimatedCount, {
propsData: {
value: 9,
duration: 1,
formatDisplayFn: (val) => "£" + val
}
});
});
it('renders a vue instance', () => {
expect(wrapper.isVueInstance()).toBe(true);
});
describe('When a value is passed in', () => {
it('should render the correct amount', async () => {
const valueOutputElement = wrapper.get("span");
wrapper.setProps({ value: 10 });
await wrapper.vm.$nextTick();
await waitRAF();
expect(valueOutputElement.text()).toBe("£10");
})
})
});