[Angular 8 Unit Testing] Testing a dump component
Setting up a Presentational Component:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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); }); });
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2018-02-14 [Angular + Unit Testing] Mock HTTP Requests made with Angular’s HttpClient in Unit Tests
2018-02-14 [Angular] Provide Feedback to Progress Events with Angular’s HttpRequest Object
2018-02-14 [Angular] Fetch non-JSON data by specifying HttpClient responseType in Angular
2018-02-14 [Angular] Read Custom HTTP Headers Sent by the Server in Angular
2018-02-14 [Angular] Set Metadata in HTTP Headers with Angular HttpHeaders
2018-02-14 [Angular] Handle HTTP Errors in Angular with HttpErrorResponse interface
2018-02-14 [Angular] Send Data via HTTP using Angular HttpParams