详解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后执行,所以在此时执行时方法没有执行。
