详解Jest结合Vue-test-utils使用的初步实践(11)
在Test5中就可以使用这个命名插槽:
<MessageList> <header slot="header">Awesome header</header> <Message v-for="message in messages" :key="message" :message="message"></Message> </MessageList>
对MessageList组件进行测试时,首先测试组件中是否渲染了命名插槽的默认内容:
// 渲染命名插槽的默认内容 it('Header slot renders a default header text', () = > { const header = wrapper.find('.list-header'); expect(header.text()).toBe('This is a default header') });
然后测试插槽是否能插入我们给定的内容,只需要将mount方法中的slots选项的键值default改为被测试的插槽的name即可:
// 向header插槽中插入内容 it('Header slot is rendered withing .list-header', () = > { wrapper = mount(MessageList, { slots: { header: '<header>What an awesome header</header>' } }); const header = wrapper.find('.list-header'); expect(header.text()).toBe('What an awesome header') })
测试debounce
我们经常使用lodash的debounce方法,来避免一些高频操作导致的函数在短时间内被反复执行,比如在Test6组件中,对button的点击事件进行了debounce,频率为500ms,这就意味着如果在500ms内如果用户再次点击按钮,handler方法会被推迟执行:
<template> <div class="outer"> <p>This button has been clicked {{count}}</p> <button @click="addCounter">click</button> </div> </template> <script> import _ from 'lodash'; export default { data() { return { count: 0 } }, methods: { addCounter: _.debounce(function () { this.handler() }, 500), handler() { this.count += 1; } } } </script>
在编写Test6的单元测试时,我们有一个这样的预期:当addCounter方法被触发时,500ms内没有任何后续操作,handler方法会被触发
如果没有进行特殊的处理,单元测试文件应该是这样的:
import { shallow } from 'vue-test-utils'; import Test6 from '@/components/Test6'; describe('Test for Test6 Component', () => { let wrapper; beforeEach(() => { wrapper = shallow(Test6); }); afterEach(() => { wrapper.destroy() }); it('test for lodash', () => { const mockFn2 = jest.fn(); wrapper.setMethods({ handler: mockFn2 }); wrapper.vm.addCounter(); expect(mockFn2).toHaveBeenCalledTimes(1); }) });
测试结果发现,addCounter被触发时handler方法并没有执行
因为lodash中debounce方法涉及到了setTimeout,`hanlder方法应该是在500ms后执行,所以在此时执行时方法没有执行。