如何在Angular中获取Event Emitter发射的值?
获取Angular EventEmitter发射的值(单元测试场景)
我明白你遇到的问题了——在单元测试里想验证EventEmitter发射的值和传入的一致,但直接打印发射器对象只能看到它的内部属性,拿不到实际发射的值。咱们一步步来解决这个问题:
先回顾下你的场景:
你在测试里调用组件方法时传入的参数:
var eventValue = <ManagedColumns>{ selectedColumns : ["Select","Last Name"], availableColumns: ["First Name"] }; component.updateColumns(eventValue);
组件里的方法实现:
updateColumns(eventValue: ManagedColumns) { console.log("KKKKKKK"+JSON.stringify(eventValue)); this.applyColumnChanges.emit(eventValue); console.log("LLLLLL"+JSON.stringify(this.applyColumnChanges)); }
直接打印component.applyColumnChanges得到的是发射器对象而非发射值,这很正常——因为EventEmitter本质是RxJS的Observable,它是用来触发事件的工具,不是存储值的容器,所以直接打印它只会显示自身的状态属性。
下面给你两种实用的方法来获取并验证发射的值:
方法一:手动订阅捕获值
这种方式适合你需要拿到发射值做更多后续验证的场景:
- 先声明变量存储捕获到的事件值:
let emittedValue: ManagedColumns;
- 在调用目标方法前,订阅组件的
applyColumnChanges发射器:
component.applyColumnChanges.subscribe(value => { emittedValue = value; });
- 调用
updateColumns方法触发事件:
const eventValue = <ManagedColumns>{ selectedColumns : ["Select","Last Name"], availableColumns: ["First Name"] }; component.updateColumns(eventValue);
- 最后做断言验证:
expect(emittedValue).toEqual(eventValue);
方法二:用Spy监听emit方法(更简洁)
如果你用的是Jasmine测试框架,直接给emit方法创建间谍函数,就能轻松验证它的调用情况和传入参数:
const eventValue = <ManagedColumns>{ selectedColumns : ["Select","Last Name"], availableColumns: ["First Name"] }; // 给emit方法创建间谍 spyOn(component.applyColumnChanges, 'emit'); // 调用目标方法 component.updateColumns(eventValue); // 验证emit是否被调用,且参数和传入值一致 expect(component.applyColumnChanges.emit).toHaveBeenCalledWith(eventValue);
这种方式不需要手动订阅,直接通过间谍函数就能完成验证,是单元测试里常用的方式。
内容的提问来源于stack exchange,提问作者a p
相关产品推荐
相关产品推荐

