【问题标题】:How to unit test @hostlistener paste event using angular 7 karma/jasmine如何使用 Angular 7 karma/jasmine 对 @hostlistener 粘贴事件进行单元测试
【发布时间】:2019-10-02 20:58:50
【问题描述】:

我在使用 karma 和 jasmine 执行测试脚本时遇到命令窗口中的错误问题,我也在使用 angular 7。我已经为监听粘贴事件的电话指令编写了单元测试。我的代码没有错误,但是当我运行测试时,我收到了这个错误。测试将运行并成功通过,我也获得了我想要的代码覆盖率,但是每次我运行单元测试时都会继续弹出这个错误。

ERROR in /phone/phone-mask.directive.
spec.ts(124,7): error TS2345: Argument of type '{
 clipboardData: DataTransfer;
}' 
is not assignable to parameter of type 'ClipboardEventInit'.
  Object literal may only specify known properties, and 'clipboardData' does not exist in type 'ClipboardEventInit'.

我尝试在测试中创建一个事件以将数据复制到剪贴板并可能填充 clipboardData 变量,但这不起作用。它首先看到该值不存在,然后构建它并成功运行。

电话指令打字稿

 @HostListener('paste', ['$event'])
 onPaste($event: ClipboardEvent) {
   $event.preventDefault();
   let pastedInput: string = $event.clipboardData
     .getData('text/plain')
     .replace(/\D/g, ''); // get a digit-only string
   if (pastedInput.length === 0) {
       pastedInput = '';
     } else if (pastedInput.length <= 3) {
       pastedInput = pastedInput.replace(/^(\d{0,3})/, '($1)');
     } else if (pastedInput.length <= 6) {
       pastedInput = pastedInput.replace(/^(\d{0,3})(\d{0,3})/, '($1) $2');
     } else {
       pastedInput = pastedInput.replace(/^(\d{0,3})(\d{0,3})(.*)/, '($1) $2-$3');
     }
   this._phoneControl.control.setValue(pastedInput.substring(0, 14), {emitEvent: false});
 }

手机测试规范

  it('should test that paste event triggers and sets value to empty string if value is empty', () => {
    fixture.detectChanges();
    const dt1 = new DataTransfer();
    const event1 = new ClipboardEvent('paste', {clipboardData: dt1});
    event1.clipboardData.setData('text/plain', '');
    inputEl.nativeElement.dispatchEvent(event1);
    fixture.whenStable().then(() => {
      expect(component.demForm.controls.PHONE.value).toEqual('');
    });
  });

我正在寻求帮助以解决此错误以及如何阻止错误显示在测试运行器 cli 中。提前谢谢你。

【问题讨论】:

    标签: javascript angular unit-testing event-handling karma-jasmine


    【解决方案1】:

    您可以在规范文件中手动调用 onPaste 函数并可以操作“事件”。如下所示;

    const event = {
          target : {
            value: null
          },
          clipboardData : {
            types: ['text/plain'],
            getData(a: string) {
              return 'test';
            }
          }
        };
        comp.onPaste(event);
        expect(event.target.value).toEqual('test');
    

    【讨论】:

    • onPaste 在组件上不存在,因为它是@hostListener 的一部分。所以试图调用它会抛出一个错误,因为它不会存在于组件中
    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2015-11-12
    • 1970-01-01
    相关资源
    最近更新 更多