单元测试ngOnInit()中的变量声明

时间:2020-02-14 13:11:47

标签: angular unit-testing jasmine karma-runner

我正在尝试提高TDD的技能,而且我还在做我可以在Angular中学习的所有教程。 但是这次尝试对它们进行100%代码覆盖率的单元测试。

我有一个愚蠢的问题,我在the documentation中找不到答案。 也无法在Stackoverflow中找到那么简单的问题。

import { Component, OnInit, OnDestroy } from '@angular/core';
import { Observable, interval, Subscription } from 'rxjs/';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit, OnDestroy {

  secondes: number;
  counterSubscritpion: Subscription;

  ngOnInit() {
    const counter = interval(1000);
    const dummy = 'foo';

    this.counterSubscritpion = counter.subscribe(
      (value) => {
        this.secondes = value;
    });
  }

  ngOnDestroy() {
    this.counterSubscritpion.unsubscribe();
  }

我的模板当然很简单:

<p> nothing should appear here : {{dummy}} </p>
<p> whereas here should be {{secondes}} secondes </p>

因此,阅读文档将帮助我测试secondescounterSubscritpion ...

但是我如何测试counterdummy以及它们的值是否已声明? 因为Karma的测试覆盖率报告告诉我,我应该测试`interval(1000)调用

到目前为止,我仍然坚持:

  let fixture: ComponentFixture<AppComponent>;
  let routerOutlet: any;

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [AppComponent]
    });
    fixture = TestBed.createComponent(AppComponent);
  });

  it ('should declare dummy variable', () => {
    const appComp = new AppComponent();
    appComp.ngOnInit();
    // and so what ???
  });

1 个答案:

答案 0 :(得分:1)

首先,您正在使用 TestBed 创建 AppComponent TestBed 配置并创建测试环境。可以创建路线,服务等等。

但是您没有在it中使用它。要通过TestBed获取创建的组件,可以调用TestBed.get(AppComponent)进行检索。

TestBed 外部(即使用new创建组件)时,您将无法访问组件的模板。尽管在某些情况下它可能很有用,但在您的情况下可能就没有用了。

  let fixture: ComponentFixture<AppComponent>;
  let component: AppComponent;

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [AppComponent]
    });
    fixture = TestBed.createComponent(AppComponent);
  });

  beforeEach(() => {
    component = TestBed.get(AppComponent);
  });

  it ('should create', () => {
    expect(component).toBeTruthy();
  });

  ...

要测试异步机制,请阅读https://codecraft.tv/courses/angular/unit-testing/asynchronous/#_code_async_code_and_code_whenstable_codehttps://codecraft.tv/courses/angular/unit-testing/asynchronous/#_code_async_code_and_code_whenstable_code。 归结为asyncfakeAsync