[Angular 8 Unit Testing] Testing a component

Setting up a Presentational Component:

import {Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation} from ‘@angular/core‘;
import {Course} from ‘../model/course‘;
import { MatDialog, MatDialogConfig } from ‘@angular/material/dialog‘;
import {CourseDialogComponent} from ‘../course-dialog/course-dialog.component‘;
import {filter, tap} from ‘rxjs/operators‘;

@Component({
  selector: ‘courses-card-list‘,
  templateUrl: ‘./courses-card-list.component.html‘,
  styleUrls: [‘./courses-card-list.component.css‘]
})
export class CoursesCardListComponent implements OnInit {

  @Input()
  courses: Course[];

  @Output()
  courseEdited = new EventEmitter();

  constructor(private dialog: MatDialog) {

  }

  ngOnInit() {

  }

  editCourse(course: Course) {

    const dialogConfig = new MatDialogConfig();

    dialogConfig.disableClose = true;
    dialogConfig.autoFocus = true;

    dialogConfig.data = course;

    const dialogRef = this.dialog.open(CourseDialogComponent, dialogConfig);

    dialogRef.afterClosed()
      .pipe(
        filter(val => !!val),
        tap(() => this.courseEdited.emit())
      )
      .subscribe();

  }

}

 

Setting up test in BeforeEach:

import { async, ComponentFixture, TestBed } from "@angular/core/testing";
import { DebugElement } from "@angular/core";

  let fixture: ComponentFixture<CoursesCardListComponent>,
    // For the Input bindings
    component: CoursesCardListComponent,
    // For query the DOM
    el: DebugElement;
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [CoursesModule]
    })
      .compileComponents()
      .then(() => {
        fixture = TestBed.createComponent(CoursesCardListComponent);
        component = fixture.componentInstance;
        el = fixture.debugElement;
      });
  }));

Because ‘compileComponents‘ is an async operation, so we have to add ‘async‘ function from Angualr Testing lib.

Setup component bindings and detectChanges:

  it("should display the course list", () => {
    // setup Input binding
    component.courses = setupCourses();
    // detech cSetuphanges
    fixture.detectChanges();
    const cards = el.queryAll(By.css(".course-card"));
    expect(cards).toBeTruthy();
    expect(cards.length).toBe(12);
  });

-- Full test code --

import { async, ComponentFixture, TestBed } from "@angular/core/testing";
import { CoursesCardListComponent } from "./courses-card-list.component";
import { CoursesModule } from "../courses.module";
import { DebugElement } from "@angular/core";
import { setupCourses } from "../common/setup-test-data";
import { By } from "@angular/platform-browser";

fdescribe("CoursesCardListComponent", () => {
  let fixture: ComponentFixture<CoursesCardListComponent>,
    // For the Input bindings
    component: CoursesCardListComponent,
    // For query the DOM
    el: DebugElement;
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [CoursesModule]
    })
      .compileComponents()
      .then(() => {
        fixture = TestBed.createComponent(CoursesCardListComponent);
        component = fixture.componentInstance;
        el = fixture.debugElement;
      });
  }));

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

  it("should display the course list", () => {
    // setup Input binding
    component.courses = setupCourses();
    // detech cSetuphanges
    fixture.detectChanges();
    const cards = el.queryAll(By.css(".course-card"));
    expect(cards).toBeTruthy("Cannot load cards");
    expect(cards.length).toBe(12, "Unexpected cards number");
  });

  it("should display the first course", () => {
    // setup Input binding
    component.courses = setupCourses();
    // detech cSetuphanges
    fixture.detectChanges();
    const course = component.courses[0];
    const firstCard = el.query(By.css(".course-card:first-child"));
    expect(firstCard).toBeTruthy("Could not find course card");
    const title = firstCard.query(By.css("mat-card-title"));
    const img = firstCard.query(By.css("img"));
    expect(title.nativeElement.textContent).toBe(course.titles.description);
    expect(img.nativeElement.src).toBe(course.iconUrl);
  });
});

原文地址:https://www.cnblogs.com/Answer1215/p/12308164.html

时间: 2024-08-26 18:02:40

[Angular 8 Unit Testing] Testing a component的相关文章

[Angular 2] @ViewChild to access Child component&#39;s method

When you want to access child component's method, you can use @ViewChild in the parent: Parent Component: import {Component, OnInit, ViewChild} from 'angular2/core'; import {HeroService, Hero} from './HeroService'; import {Observable} from 'rxjs/Rx';

[Angular Unit Testing] Testing Pipe

import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'filesize' }) export class FileSizePipe implements PipeTransform { transform(size: number, extension: string = 'MB') { return (size / (1024 * 1024)).toFixed(2) + extension; } } import

Run Unit API Testing Which Was Distributed To Multiple Test Agents

Recently I am blocked by a very weird issue, from the VS installed machine, I can run performance testing which was distributed to multiple test agents successfully, but if try to run API testing, it is always failed, I have tried run in VS and also

[Angular 2] Generate and Render Angular 2 Template Elements in a Component

Angular 2 Components have templates, but you can also create templates inside of your templates using Angular 2 ViewContainer’s createEmbeddedView for more visual control of how you want to generate elements inside of your Angular 2 templates. import

Java Unit Testing - JUnit &amp; TestNG

转自https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaUnitTesting.html yet another insignificant programming notes...   |   HOME TABLE OF CONTENTS (SHOW) Java Unit Testing -  & TestNG 1.  Introduction to Unit Testing Framework The various type o

Unit Testing a zend-mvc application

Unit Testing a zend-mvc application A solid unit test suite is essential for ongoing development in large projects, especially those with many people involved. Going back and manually testing every individual component of an application after every c

[Angular] Test component template

Component: import { Component, Input, ChangeDetectionStrategy, EventEmitter, Output } from '@angular/core'; @Component({ selector: 'stock-counter', changeDetection: ChangeDetectionStrategy.OnPush, template: ` <div class="stock-counter"> &l

Android application testing with the Android test framework

目录(?)[-] Android automated testing 1 How to test Android applications Tip 2 Unit tests vs functional tests 3 JUnit 3 4 Running tests on a server without display Test hooks into the Android framework 1 Instrumentation 2 How the Android system executes

Android Testing Point

The test application demonstrates these key points: An Android test is itself an Android application that is linked to the application under test by entries in its AndroidManifest.xml file. //一个Android的测试本身是由被测项目在AndroidManifest.xml文件链接到应用程序的Android应