Пожалуйста, рассмотрите следующий - несколько надуманный - компонент Vue:
<!-- FooBar.vue -->
<template>
<div @click="onClick">{{text}}</div>
</template>
<script>
export default {
name: 'foo-bar',
data() {
return {
text: 'foo'
}
},
methods: {
onClick() {
this.text = 'bar';
}
}
}
</script>
Я рассмотрел компонент с помощью Jest модульного теста следующим образом:
// FooBar.spec.js
import FooBar from '~/FooBar.vue';
import { shallowMount } from '@vue/test-utils';
import { expect } from 'chai';
describe('FooBar onClick()', () => {
it('should change the text to "bar"', () => {
// Arrange
const target = shallowMount(FooBar);
// Act
target.trigger('click');
// Assert
const div = target.find('div');
expect(div.text()).to.equal('bar');
});
});
Тест проходит зеленым цветом.
Когда я запускаю Jest с --coverage
для этого файла, я получаю следующий сводный отчет:
=============================== Coverage summary ===============================
Statements : 0.1% ( 2/1868 )
Branches : 0% ( 0/1402 )
Functions : 0% ( 0/505 )
Lines : 0.2% ( 2/982 )
================================================================================
Как видите, количество ветвейпоказывается, что охвачено модульным тестом 0 - Хотя Jest (или, точнее, Instanbul , который Jest использует за кулисами для покрытия) обнаружил, что тест охватил две строки кода.
Когда я провел небольшой эксперимент и добавил оператор if
внутри onClick()
примерно так:
onClick() {
if (this.text != undefined) {
this.text = 'bar';
}
}
, тогда Jest действительно посчитал 1 покрытую ветвь.
Мой вопрос - Почему Jest / Istanbul не считает код в onClick()
как покрытую ветку?