Angular 上 switch 语句的单元测试

Posted

技术标签:

【中文标题】Angular 上 switch 语句的单元测试【英文标题】:Unit-Test for a switch statement on Angular 【发布时间】:2022-01-06 08:32:48 【问题描述】:

我是角度单元测试的新手,我不知道如何测试这个开关:

  displayBadge(text: any) 
    switch (text) 
      case 'blabla':
        return 'badge badge-pill badge-success';
      case 'lalala':
        return 'badge badge-pill badge-secondary';
      case 'uuuu':
        return 'badge badge-pill badge-warning';
      case 'ooooo':
        return 'badge badge-pill badge-warning';
      case 'eeee':
        return 'badge badge-pill badge-warning';
      case 'zzzzz':
        return 'badge badge-pill badge-dark';
      case 'aaaaa':
        return 'badge badge-pill badge-dark';
      case 'qqqqq':
        return 'badge badge-pill badge-success';
      case 'ccccc':
        return 'badge badge-pill badge-warning';
      case 'rrrrr':
        return 'badge badge-pill badge-success';
      case 'ttttt':
        return 'badge badge-pill badge-warning';
      case 'fffff':
        return 'badge badge-pill badge-success';
      default:
        return '';

我在 VSCODE 上使用 Simontest 插件,代码覆盖率总是告诉我我缺少 80% 的覆盖率,这就是这个开关。

我在我的 spec.ts 文件中尝试过这种方式:

it('text aaaaa', () => 
    component.text ='aaaaa'
    component.displayBadge(component.text);
    expect('badge badge-pill badge-secondary');
  );

但它不起作用。

文本在我的 ts 中是这样定义的:

@Input()
  text!: any;

我看到有其他关于测试开关的帖子,我已经尝试了我在堆栈和 Google 上看到的所有内容,但 SimonTest 总是告诉我这个函数没有经过测试。

【问题讨论】:

我认为对 switch 语句进行单元测试不是一个好主意:您使用的是 TypeScript,因此 tsc 将验证并数学证明(在其内部的、仅限类型理论的 mini-theorem-provider) 中,例如 switch 语句。另外,可能也很脆。 如果不是我的一位客户的要求,我不会这样做。我认为测试应该只验证是否通过在文本中输入值“aaaaa”开关返回为该输入选择的正确标志。看起来很简单,但我找不到方法。 “如果不是我的一个客户的要求,我不会这样做” - 在这种情况下,我希望您添加一个额外的“customer-has-incredibly-ill-通知-要求-住宿费”然后告诉他们阅读这个:levelup.gitconnected.com/… 【参考方案1】:

由于 displayBadge() 正在返回您正在测试的值,因此应该可以这样:

it('text aaaaa', () => 
 expect(component.displayBadge('aaaaa')).toEqual('badge badge-pill 
 badge-secondary');
);

【讨论】:

感谢您的回答,但它不起作用。 更新了答案以删除一些代码。如果这不起作用,您看到的测试错误是什么? 当我访问 test.html 文件(在代码覆盖率文件夹中)时,它会显示如下:“函数未覆盖”悬停在函数名称上,“语句未覆盖”悬停在每个顶部每个案件的回报。

以上是关于Angular 上 switch 语句的单元测试的主要内容,如果未能解决你的问题,请参考以下文章

MatDialog 服务单元测试 Angular 6 错误

在单元测试用例中模拟 Angular $window

Jasmine 使用 Angular 中的 TypeScript 对文件大小进行单元测试

gcov 和 switch 语句

无效的 Switch 语法构建成功?

Angular - 组件中订阅功能的单元测试