Angular 如何使用Render2测试指令?

Angular 如何使用Render2测试指令?,angular,unit-testing,testing,Angular,Unit Testing,Testing,我创建了一个小指令,用于防止传递给它的事件发生默认情况 @指示{ 选择器:“[sPreventDefault]” } 导出类PreventDefaultDirective{ 私有事件:=>void[]=[]; @输入'sPreventDefault'设置ListNoEvents:string | string[]{ 这是RemovelListeners; 如果事件类型=='string'{ 事件=[事件]; } 此文件为.registerEventListener 事件, e=>{ 如果e in

我创建了一个小指令,用于防止传递给它的事件发生默认情况

@指示{ 选择器:“[sPreventDefault]” } 导出类PreventDefaultDirective{ 私有事件:=>void[]=[]; @输入'sPreventDefault'设置ListNoEvents:string | string[]{ 这是RemovelListeners; 如果事件类型=='string'{ 事件=[事件]; } 此文件为.registerEventListener 事件, e=>{ 如果e instanceof事件{ e、 停止传播; }否则{ e、 srcEvent.stopPropagation; } }, ; } 构造函数私有元素引用:元素引用,私有渲染器:渲染器2{ superelementRef,渲染器; } 受保护的注册表EventListenerListenon:string[],eventListener:e:Event | HammerJSEvent=>void:void{ this.events=listenOn.mapeventName=>{ 返回this.renderer.listense.elementRef.nativeElement、eventName、eventListener; }; } 受保护的RemovelListeners:无效{ this.events.forEachdispose=>dispose; this.events=[]; } } 试衣

@组成部分{ 选择器:“测试主机”, 模板:``, } 类TestHostComponent{ @ViewChildPreventDefaultDirective!:PreventDefaultDirective; @输入事件:PreventDefaultDirective['listenOn']=[]; } fdescribe'PreventDefaultDirective',=>{ let host:TestHostComponent; let-hosteelement:DebugElement; let夹具:组件夹具; let指令:PreventDefaultDirective; beforeachasync=>{ TestBed.configureTestingModule{ 声明:[ TestHostComponent, 预防性指令, ], }.汇编组件; fixture=TestBed.createComponentTestHostComponent; hostElement=fixture.debugElement; 主机=fixture.componentInstance; 指令=host.directive; }; 它“应该创建一个实例”,=>{ host.events=['testEvent']; 夹具。检测变化; expectdirective.toBeTruthy; }; 它“应该添加侦听器”,=>{ host.events=['testEvent']; 夹具。检测变化; //DebugElement.listeners为空 expecthostElement.listeners.length.toBe1; expecthostElement.listeners.mapl=>l.name.toBehost.events; }; };
我的问题是,DebugElement似乎不知道通过renderr2.listen方法注册的事件。什么是测试这个问题的正确方法?

好的,因为我感兴趣,我检查了一些东西,但它不是直接的答案,甚至不是问题的解决方案,尽管你可以找到一些有用的东西

它看起来像hostElement.listeners指向@HostListener decorator添加的事件侦听器,您可以轻松地检查它。 我也试着找到方法来找回听众,但没有成功

在这里,我要做的是在调用renderer.listen时进行检查,并将实现留在后面——这种方法对于高于单元测试的测试可能是错误的,因为您希望检查这种方法是否真的有效,但对于单元测试应该是好的。如果要监视Render2,可以执行以下操作:

const renderer = fixture.componentRef.injector.get(Renderer2);
const listenSpy = spyOn(renderer, 'listen');
expect(listenSpy).toHaveBeenCalled();
编辑1: 由于提供的获取渲染器2的方法已被弃用,因此应使用以下方法:

const renderer = fixture.componentRef.injector.get(Renderer2 as Type<Renderer2>);

这确实有效,我完全忘记了注射器!我只想问一下这个反对意见,对我来说,这似乎是假阳性,但人们永远无法确定。错误:get已弃用:从v4.0.0开始,使用Type或InjectionToken弃用关于其余部分,您完全正确,但我想测试它是否正在被调用、清理,以及它是否确实阻止了默认设置。所有这些都可以通过间谍来完成。@Akxe你说得对,它不应该再抱怨了:const renderer=fixture.componentRef.injector.getRenderer2 as Type;True,但您不需要,因为get的类型定义从type的泛型推断类型。但我不知道为什么这是必要的