angular - 如何触发订阅函数内的事件发射器。角度单元测试
问题描述
我一直在尝试测试一个包含 EventEmitter 订阅的函数,单元测试正在调用订阅,但是无法测试订阅中的代码,我的意思是,filter
即使getDocuments()
订阅也没有被测试正在被调用。
describe('trigger_data test', () => {
it('not filter in storage', async(() => {
component.filter = null;
spyOn(component, 'getDocuments');
spyOn(mockSharedService.trigger_data, 'subscribe').and.returnValue(of(true));
component.triggerData();
expect(mockSharedService.trigger_data.subscribe).toHaveBeenCalled();
expect(component.filter).toEqual(1); //Error: Expected null to equal 1.
expect(component.getDocuments).toHaveBeenCalled(); //Error: Expected spy getDocuments to have been called.
}));
});
这是功能
triggerData() {
this.sharedService.trigger_data.subscribe(() => {
if (sessionStorage.getItem('filter_pp') !== null) {
this.filter = Number(sessionStorage.getItem('filter_pp'));
} else {
this.filter = 1;
}
this.getDocuments();
});
}
当另一个组件发出布尔值时,订阅会触发代码。
解决方案
您正在监视该subscribe
方法并让它返回一个 Observable,这是不正确的。(subscribe 是 Observable 上的一个方法,它返回一个订阅)
有几种方法可以解决此问题:
- 确保在创建模拟时将 mockSharedService.trigger_data 设置为正确的 Observable(为此,我认为我们需要查看更多测试代码)。
- 在您的测试中使用以下命令覆盖 mockSharedService.trigger_data:(
mockSharedService.trigger_data = of(true)
注意:如果 trigger_data 是 EventEmitter,TypeScript 不会喜欢这样,您可能需要mockSharedService.trigger_data = of(true) as any
:) - 如果您想避免转换为任何类型,就像我在前面的示例中所做的那样,您可以使用:
const emitter = new EventEmitter();
mockSharedService.trigger_data = emitter;
emitter.emit(true);
- 使 trigger_data 成为返回 Observable 的方法,并使用
spyOn(mockSharedService, 'trigger_data').and.returnValue(of(true))
. 但是,这样做还需要您将triggerData
实现更改为调用trigger_data()
,而不仅仅是将其作为属性访问。
我一直在尝试测试一个包含 EventEmitter 订阅的函数
此外,您可能希望使用 Subject 而不是 EventEmitter,Angular 使用 EventEmitter 进行输出绑定。在实现自己时,在 Angular 的输出之外,我们可以使用 Subjects 而不是 EventEmitters(它实际上扩展了 Subjects,为了 Angular 的输出。参见:https ://github.com/angular/angular/blob/master/packages/核心/src/event_emitter.ts#L64 )
推荐阅读
- java - 为什么这个最大公约数的输出为 0
- node.js - 为什么我在安装 npm 包时会出现此错误?
- rust - 如何使用不安全代码对数组中的同一元素进行多个可变引用?
- python - python中的语音识别.ogg文件
- flutter - 我无法为我的颤振项目获取依赖项 - Flutter pub get issues
- python - 比较具有不同列名的两个数据框,并使用来自第二个数据框的列更新第一个数据框
- ios - 当 AccessoryInputView 的键盘不存在时,键盘将显示调用的通知
- python - 网页抓取网站 - 无法打印价格 - 我认为是 api 和 json
- json - ASP.net 返回 json 但邮递员显示 unicode
- python - 清屏后 NumericProperty 不改变值