具体到例子中来看,我们要测试的是:Message组件是否出现在具有list-messages的类的ul中。在测试时,为了将slots传递给MessageList组件,我们在MessageList.spec.js中的mount或者shallow方法中使用slots属性
import { mount } from 'vue-test-utils'; import MessageList from '@/components/Test4/MessageList'; describe('Test for MessageList of Test4 Component', () => { let wrapper; beforeEach(() => { wrapper = mount(MessageList, { slots: { default: '<div class="fake-msg"></div>' } }); }); afterEach(() => { wrapper.destroy() }); // 组件中应该通过slots插入了div.fake-msg it('Messages are inserted in a ul.list-messages element', () => { const list = wrapper.find('ul.list-messages'); expect(list.contains('div.fake-msg')).toBeTruthy() }) });
为了测试内容是否通过插槽插入了组件,所以我们伪造了一个div.fake-msg通过slots选项传入MessageList组件,断言组件中应该存在这个div
不仅如此,slots选项还可以传入组件或者数组:
import AnyComponent from 'anycomponent' mount(MessageList, { slots: { default: AnyComponent // or [AnyComponent, AnyComponent] } })
这里面有一个问题,例如我们想测试Message组件是否通过插槽插入了MessageList组件中,我们可以将slots选项中传入Message组件,但是由于Message组件需要传入message作为Props,所以按照上面的说明,我们应该这样做:
beforeEach(() = > { const fakeMessage = mount(Message, { propsData: { message: 'test' } }); wrapper = mount(MessageList, { slots: { default: fakeMessage } }) });
对应的断言是:
// 组件中应该通过slots插入了Message,并且传入的文本是test it('Messages are inserted in a ul.list-messages element', () = > { const list = wrapper.find('ul.list-messages'); expect(list.contains('li')).toBeTruthy(); expect(list.find('li').text()).toBe('test') })
但是这会失败,查了资料,貌似不能通过这种方式mounted的组件传入slots中。
虽然如此,我们可以而通过渲染函数(render function)来作为一种非正式的解决方法:
const fakeMessage = { render(h) { return h(Message, { props: { message: 'test' } }) } }; wrapper = mount(MessageList, { slots: { default: fakeMessage } })
测试命名插槽(Named Slots)
测试命名插槽和默认插槽原理相同,创建Test5组件,里面应用新的MessageList组件,组件中增加一个给定名字为header的插槽,并设定默认内容:
<div> <header class="list-header"> <slot name="header">This is a default header</slot> </header> <ul class="list-messages"> <slot></slot> </ul> </div>
内容版权声明:除非注明,否则皆为本站原创文章。