AngularJS的Karma中$emit测试:toHaveBeenCalledWith参数取值咨询
关于Karma测试中
toHaveBeenCalledWith参数的说明 嘿,作为刚上手Karma测试的新手,这种困惑太正常啦!我来一步步给你讲清楚toHaveBeenCalledWith里该传入的MY_EVENT_ID和args到底是什么~
首先得回忆一下Vue中$emit的调用逻辑:在你的组件代码里,你应该是这样触发事件的:
this.$emit(MY_EVENT_ID, arg1, arg2, ...)
而toHaveBeenCalledWith的作用,就是断言这个$emit方法被调用时,传入的参数和你预期的完全匹配。
1. 关于MY_EVENT_ID参数
这个就是你在组件中定义的事件名称标识——可能是一个字符串字面量,比如'user-submitted',也可能是一个提前定义好的常量(比如const MY_EVENT_ID = 'user-submitted')。
在测试里,你需要传入和组件中完全一致的值:
- 如果组件里直接用字符串触发:
this.$emit('user-submitted', data),那测试里就传'user-submitted' - 如果组件里用常量:
this.$emit(MY_EVENT_ID, data),那测试里要确保你也引入了这个常量,或者直接写它对应的字符串值
2. 关于args参数
这里的args就是你在触发$emit时,跟在事件ID后面传递的所有数据参数,要注意保持顺序和值的一致性:
- 如果
$emit只传了事件ID,没有额外数据:this.$emit('close-modal'),那toHaveBeenCalledWith里就只传事件ID即可 - 如果传了一个参数:
this.$emit('update-user', { id: 1, name: 'Krsna' }),那就要把这个对象作为第二个参数传入 - 如果传了多个参数:
this.$emit('delete-item', 1, 'permanent'),那就要按顺序把1和'permanent'都传进去
举个实际的例子
假设你的组件代码是这样的:
// 组件文件:UserForm.vue export default { setup() { const MY_EVENT_ID = 'user-form-submitted'; const handleSubmit = (formData) => { this.$emit(MY_EVENT_ID, formData); }; return { handleSubmit }; } }
对应的Karma测试代码可以这么写:
// 测试文件:UserForm.spec.js import UserForm from '@/components/UserForm.vue'; import { shallowMount } from '@vue/test-utils'; // 确保和组件里的事件ID一致 const MY_EVENT_ID = 'user-form-submitted'; describe('UserForm', () => { it('emits correct event with form data when submitted', () => { const wrapper = shallowMount(UserForm); const testFormData = { username: 'krsna', email: 'krsna@example.com' }; // 监听$emit方法 const emitSpy = jest.spyOn(wrapper.vm, '$emit'); // 触发提交方法 wrapper.vm.handleSubmit(testFormData); // 断言$emit被正确调用 expect(emitSpy).toHaveBeenCalledWith( MY_EVENT_ID, testFormData ); }); });
最后再划个重点
MY_EVENT_ID必须和组件中$emit的第一个参数完全匹配,大小写、字符串内容都不能错args要和$emit传递的参数顺序一致、值一致,如果是对象或数组,要确保结构和内容都符合预期
内容的提问来源于stack exchange,提问作者krsna




