【问题标题】:unit test a variable declaration inside ngOnInit()对 ngOnInit() 中的变量声明进行单元测试
【发布时间】:2020-02-15 00:23:34
【问题描述】:

我正在努力提高 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 ???
  });

【问题讨论】:

    标签: angular unit-testing jasmine karma-runner


    【解决方案1】:

    首先,您使用 TestBed 来创建 AppComponentTestBed 配置并创建一个测试上下文。可以创建路线、服务等等。

    但您没有在 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

    【讨论】:

    • 好的,谢谢您的回复:它有帮助。稍后我将遵循您对异步代码的建议。顺便说一句,很棒的文章。但是,我仍然不确定如何对这个事实进行单元测试,即在这个组件中,我有一个 dummy 变量,显示在模板中,具有 'foo' 值(看起来像是对非异步代码的三个不同测试对我来说,我是对的吗?)
    • 我忘记写了 :) 无法知道变量是否在名为 myFn 的函数中声明(在我们的例子中可能是 ngOnInit)。相反,我们可以在myFn 之外声明一个变量并检查类字段成员是否已更改(换句话说,查找副作用)。但是由于模板内部的dummy变量不是AppComponent的字段成员,所以它永远不会反映在模板内部。测试它似乎毫无意义。
    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2020-08-08
    相关资源
    最近更新 更多