【问题标题】:How to write test case for if else statement in Angular (Jasmine)如何在Angular(Jasmine)中为if else语句编写测试用例
【发布时间】:2020-03-24 08:10:50
【问题描述】:

我正在用 Angular 编写自定义指令的测试用例。这是我在stackblitz 中的代码。谁能让我知道如何涵盖突出显示的 if else 声明。

if (trimmedValue.length > 14) {
  // how to cover this statement
  trimmedValue = trimmedValue.substr(0, 14);
}

if (trimmedValue.substr(6, 2) !== '') {
  // how to cover this statement
  nricNumber.push(trimmedValue.substr(6, 2));
}

【问题讨论】:

  • @AndrewAllen 已更新。你能对我的问题投票吗?

标签: angular unit-testing karma-jasmine code-coverage


【解决方案1】:

首先,您要根据要侦听的事件将指令中的主机侦听器更改为类似或类似的内容:

@HostListener('keydown', ['$event'])

由于您将指令放在不需要在指令中查找输入的输入上,这也将使其仅在主机元素上监视“keydown”。 HostListener 的第一个参数应该是您正在侦听的事件,而不仅仅是元素的名称。

因此,现在如果您将测试更改为发出 keydown 事件,输入中的值的长度大于 14,您应该点击第一个 if 语句,如下所示:

it('should input value length > 14', () => {
    fixture = TestBed.createComponent(TestAutoDashNricComponent);
    const input = fixture.debugElement.query(By.directive(AutoDashNricDirective));

    // set value of input to something longer than 14
    input.nativeElement.value = '85060135229900000000123';

    const event = ({
      // set target to the input so you don't need to get it from the directive itself
      target: input.nativeElement, 
    } as unknown) as KeyboardEvent;

    // trigger keydown with created event
    input.triggerEventHandler('keydown', event);

    // check length of input value
    expect(input.nativeElement.value.length).toBe(14);
});

还请注意,我将目标设置为指向调用指令的输入。这样你就不需要在指令本身内部寻找“输入”。

通过这个示例,您应该能够通过执行类似的操作来命中其他 if else 语句。

【讨论】:

  • 酷。工作,但为什么这个文件的分支覆盖率仍然是 50%?
  • 您可能还需要为 else 情况添加测试。所以当长度小于 14 时为 1
猜你喜欢
  • 1970-01-01
  • 2021-06-07
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
相关资源
最近更新 更多