无法在单元测试用例中调用@HostListener方法

2024-04-19

我使用创建了一个自定义指令@Directive我正在使用的@HostListener并且代码运行良好。
现在,在编写测试用例时,我需要调用@HostListener单元测试用例中的方法。我还可以看到在代码覆盖率中代码没有被覆盖。
以下是代码:

焦点封装.directive.ts

import { Directive, ElementRef, HostListener } from '@angular/core';

@Directive({
  selector: '[appFocusEncapsulation]'
})
export class FocusEncapsulationDirective {

  constructor(private el: ElementRef) { }

  @HostListener('keydown', ['$event'])
  keyDown(event: Event) {
    console.log('event : ', event);
    event.preventDefault();
  }

}

焦点封装指令规范 ts

import { FocusEncapsulationDirective } from './focus-encapsulation.directive';
import { Component, ElementRef, DebugElement } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from "@angular/platform-browser";

@Component({
  template: `<div appFocusEncapsulation><button type="button" (click)="add()">ADD</button></div>`
})
class TestHoverFocusComponent {
  constructor(private el: ElementRef) { 
    console.log('in constructor')
  }
}

fdescribe('FocusEncapsulationDirective', () => {

  let component: TestHoverFocusComponent;
  let fixture: ComponentFixture<TestHoverFocusComponent>;
  let inputEl: DebugElement;
  let elementRef: ElementRef

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [TestHoverFocusComponent, FocusEncapsulationDirective]
    });
    fixture = TestBed.createComponent(TestHoverFocusComponent);
    component = fixture.componentInstance;
    elementRef = fixture.nativeElement;
    inputEl = fixture.debugElement.query(By.css('button'));
  });

  it('should create an instance', () => {
    const directive = new FocusEncapsulationDirective(elementRef)
    expect(directive).toBeTruthy();
  });

  it('Focus over elements', () => {
    fixture.detectChanges();
    const event = {
      which : 9,
      keyCode : 9,
      srcElement :{
        innerText : 'ADD'
      },
      preventDefault: function() {
        console.log('preventDefault() method called');
      }
    }
    spyOn(event, 'preventDefault');
    inputEl.triggerEventHandler('keydown', event);
    expect(event.preventDefault()).toHaveBeenCalled();
  });

});

Below you can also see the code coverage report:
enter image description here

在这里,我需要覆盖代码并执行该方法所需的正确测试用例。谢谢。


这是测试的固定版本:

fdescribe('FocusEncapsulationDirective', () => {

  let fixture: ComponentFixture<TestHoverFocusComponent>;
  let inputEl: HTMLElement;

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [TestHoverFocusComponent, FocusEncapsulationDirective]
    });
    fixture = TestBed.createComponent(TestHoverFocusComponent);
    inputEl = fixture.nativeElement.querySelector('button');
  });

  it('Focus over elements', () => {
    fixture.detectChanges();
    const event = new Event('keydown', { bubbles: true });
    spyOn(event, 'preventDefault');
    inputEl.dispatchEvent(event);
    expect(event.preventDefault).toHaveBeenCalled();
  });

});

关键点:

  • 您需要将间谍函数本身传递给expect(),以检查它是否已被调用。你的代码callssied 函数,并将其返回值传递给expect()。
  • 您需要传递一个实际事件(尤其是一个有其自身特点的事件)bubbles标志设置为 true,否则事件不会冒泡,并且侦听器位于封闭的div因此,不会将包含的按钮上触发的事件通知给原生 DOM 元素。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在单元测试用例中调用@HostListener方法 的相关文章

随机推荐

  • 如何在 R 中使用“<<-”(范围分配)?

    我刚刚读完R 介绍中的范围界定 http cran r project org doc manuals R intro html Scope 并且我很好奇 lt lt 任务 该手册展示了一个 非常有趣的 示例 lt lt 我觉得我明白了 我
  • 模拟器未运行

    在我将硬盘更换为另一个 MotherBoard i5 3GHz 处理器而未重新安装操作系统后 我的 AVD 模拟器无法运行 操作系统 Ubuntu 10 10 我的模拟器没有通过 Eclipse 运行 当我单击 Run As Android
  • Web 测试记录器不允许我记录测试 IE11 windows 7

    我正在尝试使用以下方法记录 Web 性能测试网络测试记录器 12 00VS 2013 自带的插件 This is what I get when the toolbar opens 如您所见 按钮呈灰色且禁用 我已关注这个解决办法 http
  • Primefaces FileUpload 不适用于 PrettyFaces 和 Spring Boot

    我将 Spring Boot 1 5 2 RELEASE 与 JSF 2 2 14 Primefaces 6 1 和 PrettyFaces 3 4 1 Final 一起使用 我的pom文件如下
  • HTML
    标签导致 Rails 表单提交 GET 而不是 POST 请求

    我有一个可以正常工作的表单 直到我添加样式标签 我正在使用 twitter bootstrap 该应用程序是 Rails 3 1 我使用的是 Mac 这是一个可以正常工作的表格 没有任何问题 div class alert message
  • Android 数据库 - 无法执行此操作,因为连接池已关闭

    我对 android 数据库和游标有奇怪的问题 有时 很少 发生 我收到客户的崩溃报告 很难找出它崩溃的原因 因为我有大约 150 000 个活跃用户 可能每周大约有 1 个报告 所以这确实是一些小错误 这是例外 STACK TRACE j
  • 找不到 db4o 数据库文件

    您好 我正在编写一个简单的 CRUDE 应用程序 该应用程序使用 JSF 和 DB4O 完美运行 我可以正常添加并列出所有实体 不会出现错误 我使用此代码来保存实体 bd Db4oEmbedded openFile configuratio
  • 如何在传递一些上下文时在expressjs中重定向?

    我正在使用express 在node js 中制作一个网络应用程序 这是我所拥有的内容的简化 var express require express var jade require jade var http require http v
  • iOS照片框架

    我想检索所有照片local设备上的相册 基本上设备上的所有照片 本地标识符列表是否唯一 使用照片框架的最佳方法是什么 我的问题不重复 因为另一个问题还讨论了云资产和设备上没有的资产 当检索图像的实际数据时 它会在尝试获取同步时返回空数据 我
  • ModuleWithProviders 需要 1 个类型参数 - angular-autofocus-fix

    安装后angular autofocus fix 导入自动对焦模块 当我运行角度项目时 它显示以下错误 ERROR in node modules angular autofocus fix index d ts 4 23 error TS
  • 从数据表中获取隐藏行内容并将其与表单一起提交

    我遇到了一个问题 现在它占用了我的时间 我有一个包含 7 条记录的表 例如 该表具有 input 和 textarea 元素 用户可以在其中输入内容 现在 分页的值为每页 5 条记录 我有两个页面 用户在评论部分输入数据 单击分页中的 下一
  • viewWillAppear 与 Viewdidload ios

    当使用 iOS 导航应用程序编写代码时 我遇到了以下问题 我可以在哪里放置 UITableView 的 initdata 方法 在 viewWillAppear 或 viewDidLoad 中 请帮帮我 您可以根据应用程序的要求放置 ini
  • sql Sparklyr Sparkr Databricks 上的数据帧转换

    我在使用以下代码创建的数据块上有 sql 表 sql CREATE TABLE data USING CSV OPTIONS header true inferSchema true LOCATION url data csv 以下代码分别
  • Iptables v1.6.1 无法初始化 iptables 表“过滤器”Ubuntu 18.04 Bash Windows

    我正在从 Windows Bash 运行 Ubuntu 18 04 uname a Linux DESKTOP M87DGAS 4 4 0 17134 Microsoft 112 Microsoft Thu Jun 07 22 57 00
  • Mongo $in 与复合索引

    如何高效地做好 in使用复合索引查找集合 下面的示例中 索引位于字段 a 和 b 上 例如 db foo createIndex a 1 b 1 SQL 中的示例 SELECT FROM foo WHERE a b IN aVal1 bVa
  • 实体框架上下文 6.1.3 未刷新/销毁?

    在此单元测试中 我将验证内容字节列的 MD5 是否已正确计算 保存和获取 但是 实体框架 6 1 3 上下文似乎没有刷新 销毁 因为在原始 SQL UPDATE 明显生效之后 但在使用新上下文获取行时没有显示 namespace UnitT
  • 按时间合并 pandas 数据框和另一列

    我有两个熊猫数据框 我正在尝试将它们组合成一个数据框 我是这样设置它们的 a date 1 1 2015 00 00 1 1 2015 00 15 1 1 2015 00 30 num 1 2 3 b date 1 1 2015 01 15
  • dart 中“library”关键字的确切含义

    我知道这个关键字应该在一些自定义库中使用 但当我放下它时 什么也没有发生 至少我没有注意到任何事情 进口仍然运作良好 私人会员仍然是私人的 有人可以解释一下 Dart 中的 library 关键字的作用吗 更新2018 03 05 有一段时
  • 如何获取Recyclerview特定Item的ViewHolder

    有没有办法获得ViewHolder仅基于给定位置的回收者视图的特定项目 就像是getViewHolder position public MyViewHolder getViewHolder int position MyViewHolde
  • 无法在单元测试用例中调用@HostListener方法

    我使用创建了一个自定义指令 Directive我正在使用的 HostListener并且代码运行良好 现在 在编写测试用例时 我需要调用 HostListener单元测试用例中的方法 我还可以看到在代码覆盖率中代码没有被覆盖 以下是代码 焦