В настоящее время я пытаюсь получить единичный файловый компонент (ComponentB
), протестированный с использованием Jest и vue-test-utils. ComponentB
extends ComponentA
, для которого определен метод update(product)
.
/* -------- Component B -------- */
<script>
import ComponentA from './ComponentA'
export default {
extends: ComponentA,
props: [...],
data: () => {
productData: {foo: 'bar', baz: 'shiz'}
},
methods: {
updateProduct() {
this.update(this.productData)
}
}
}
</script>
/* -------- Component A -------- */
<script>
export default {
props: [...],
data: () => {...},
methods: {
update(productData) {
...
}
}
}
</script>
Затем я пытаюсь выполнить модульный тест, в котором я shallowMount()
мой ComponentB
и пытаюсь jest.spyOn
метод update(productData)
, определенный в ComponentA
. Тест выглядит так:
it('calls update with data when input is added to the field', () => {
const spy = jest.spyOn(ComponentA, 'update);
const wrapper = shallowMount(ComponentB, { propsData: { ... } });
const contractIdInput = wrapper.find('#contract-id-input > b-form-input');
contractIdInput.element.value = 'foobar';
contractIdInput.trigger('input')
expect(spy).toHaveBeenCalledWith(...someDataHere...)
});
Когда я запускаю этот тест, я получаю Cannot spy the update property because it is not a function; undefined given instead
.
Я не совсем уверен, почему это не работает, хотя у меня действительно есть некоторые идеи.
Во-первых, поскольку я shallowMount()
использую свой ComponentB
, он ничего не узнает о своем родительском компоненте и, следовательно, не имеет доступа к методу update(productData)
, который определен в ComponentA
.
Во-вторых, возможно, я не вызываю jest.spyOn()
в нужное время и должен вместо этого вызывать его после создания объекта-оболочки ComponentB
. Тем не менее, я попытался изменить это и не добился успеха или другого поведения.
Итак, мой вопрос: как мне следить за методом, который предоставляется расширенным компонентом, когда я монтирую монтируемый компонент?