使用 Angular 和 Jasmine/Karma 的私有方法进行测试和代码覆盖

Posted

技术标签:

【中文标题】使用 Angular 和 Jasmine/Karma 的私有方法进行测试和代码覆盖【英文标题】:Tests and code-coverage with private methods with Angular and Jasmine/Karma 【发布时间】:2020-06-02 19:06:18 【问题描述】:

所以,我在按钮组件上使用了这些方法。

export class SidebarButtonComponent implements OnInit 

  private subscribeToRouter(): void 
    this.router.events.subscribe(route => 
      if (route instanceof NavigationEnd) 
        this.isSelected(route.urlAfterRedirects);
      
    );
  

  private isSelected(route: string): void 
    if (this.checkRoute(route)) 
      this.selected = true;
     else 
      this.selected = false;
    
  

  private checkRoute(route: string): boolean 
    return route.includes(this.link);
  


我知道我无法访问我的 specs 文件中的私有方法,但是 Angular 的代码覆盖率说我没有覆盖它:

59.09% Statements 13/22 37.5% Branches 3/8 42.86% Functions 3/7 52.63% Lines 10/19

测试这些私有测试的最佳方法是什么,或者至少在代码覆盖率中忽略它们?

【问题讨论】:

您的组件中应该有一些公共方法调用私有函数,在这种情况下,您可以使用所有可能的组合编写公共方法的 UT,以便它也涵盖私有方法,您将获得私有方法。 【参考方案1】:

typescript 中的访问修饰符仅在编译时使用。你不能像这样直接访问它们

component.privateMethod(); // not accessible 

但您可以使用任何方式访问它们:

(component as any).privateMethod();

这是访问私有方法的一种解决方法,否则您可以使用调用这些私有方法的方法对其进行测试。

【讨论】:

以上是关于使用 Angular 和 Jasmine/Karma 的私有方法进行测试和代码覆盖的主要内容,如果未能解决你的问题,请参考以下文章

如何安装和导入 angular 2 '@angular/router'?

在 Angular 5 和 AOT-Build 中使用 @angular 编译器时出错

如何使用 angular5 和 angular 材质创建自定义颜色主题

Angular篇—Angular1和Angular2的区别

Angular - 在服务和组件中使用管道

Angular:使用打开和关闭sidenav(Angular Materials)使div填充剩余的水平空间