expect(mockFn).toHaveBeenCalledTimes(1)
})
});
通过setMethods方法用mock函数代替真实的方法,然后就可以断言点击按钮后对应的方法有没有被触发、触发几次、传入的参数等等。
现在我们测试了点击事件后能触发对应的方法,下面要测试的就是increment方法将触发Test1组件中自定义的add方法
// increment方法会触发add方法
it('triggers a addCounter event when a handleClick method is called', () = > {
const wrapper = mount(MyButton); // mock自定义事件
const mockFn1 = jest.fn();
wrapper.vm.$on('add', mockFn1);
// 触发按钮的点击事件
wrapper.find('button').trigger('click');
expect(mockFn1).toBeCalled();
expect(mockFn1).toHaveBeenCalledWith(1);
// 再次触发按钮的点击事件
wrapper.find('button').trigger('click');
expect(mockFn1).toHaveBeenCalledTimes(2);
expect(mockFn1).toHaveBeenCalledWith(2);
})
这里使用了$on方法,将Test1自定义的add事件替换为Mock函数
对于自定义事件,不能使用trigger方法触发,因为trigger只是用DOM事件。自定义事件使用$emit触发,前提是通过find找到MyButton组件
// $emit 触发自定义事件
describe('验证addCounter是否被触发', () = > {
wrapper = mount(Test1);
it('addCounter Fn should be called', () = > {
const mockFn = jest.fn();
wrapper.setMethods({
'addCounter': mockFn
});
wrapper.find(MyButton).vm.$emit('add', 100);
expect(mockFn).toHaveBeenCalledTimes(1);
});
wrapper.destroy()
});
测试计算属性
创建Test2组件,实现功能是使用计算属性将输入框输入的字符翻转:
<template>
<div class="wrapper">
<label for="input">输入:</label>
<input id="input" type="text" v-model="inputValue">
<p>输出:{{outputValue}}</p>
</div>
</template><script>
export default {
name: 'Test2',
props: {
needReverse: {
type: Boolean,
default: false
}
},
data() {
return {
inputValue: ''
}
},
computed: {
outputValue () {
return this.needReverse ? ([...this.inputValue]).reverse().join('') : this.inputValue
}
},
methods: {},
components: {}
}
</script>
<style scoped>
.wrapper {
width: 300px;
margin: 0 auto;
text-align: left;
}
</style>
在Test2.spec.js中,可以通过wrapper.vm属性访问一个实例所有的方法和属性。这只存在于 Vue 组件包裹器中。










