You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

AngularJS的Karma中$emit测试:toHaveBeenCalledWith参数取值咨询

关于Karma测试中toHaveBeenCalledWith参数的说明

嘿,作为刚上手Karma测试的新手,这种困惑太正常啦!我来一步步给你讲清楚toHaveBeenCalledWith里该传入的MY_EVENT_IDargs到底是什么~

首先得回忆一下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

火山引擎 最新活动