我正在为以下组件编写单元测试:
<template>
<sub-component
@foo="bar"
/>
</template>
<script>
import SubComponent from './SubComponent';
export default {
name: 'MyComponent',
components: { SubComponent },
methods: {
bar(payload) {
this.$emit('baz', ...payload);
}
}
}
</script>
测试内容如下:
import { shallowMount } from '@vue/test-utils';
import _ from 'lodash';
import MyComponent from '../../components/MyComponent';
describe('MyComponent.vue', () => {
let wrapper;
beforeEach(() => {
wrapper = shallowMount(MyComponent);
});
it('should emit baz on subcomponent foo', () => {
const subComp = wrapper.find('sub-component-stub');
expect(subComp.exists()).toBe(true); // passes
subComp.vm.$emit('foo');
return wrapper.vm.$nextTick().then(() => {
expect(wrapper.emitted().baz).toBeTruthy(); // does not pass;
// upon logging:
console.log(_.isEqual(wrapper, subComp)); // => true
})
})
})
这个例子过于简化,但是这里的原则是我想要一个可重用的
<sub-component>
(一个模态框),以及各种功能包装器(与模态框执行的特定任务相关),它们映射了额外的功能。我不希望在父组件中添加功能,因为这会违反DRY - 我必须将其放置在每个包含特定类型模态框的组件中。如果
<sub-component>
不是<template>
的直接子级,则可以正常工作。不知何故,看起来和托管在同一个元素上。应该如何正确地测试这个呢?
wrapper.find(SubComponent)
会出错,因为SubComponent
没有定义:它没有被导入。我不是使用mount
,而是使用shallowMount
,这使得所有子组件都成为存根。正如您在问题中可能注意到的那样,我正确地找到了子组件(用于 shallowMount)。然而,由于子组件也是组件的根元素(因为它是<template>
的唯一子元素),所以正常的$emit('foo', payload)
不像嵌套更深的情况下那样起作用:(例如:<template><div><sub-component/></div></template>
- 这个可以正常工作)。 - taopayload
的传播,我需要在测试中为 emit 的 args 参数创建一个数组:subComponent.vm.$emit('foo', ['hello'])
。对我来说,答案中的代码运行良好。请告诉我。 - mickaelw