【Angular】使用Jest访问子组件

首先

我在使用Jest对Angular UI组件之一的primeNg进行单元测试时,想要使用Angular Material中的Harnesses。然而,primeNg中并没有相应的Harnesses,所以我找到了一个替代方案并与大家分享。

概括:

const debugEl = fixture.debugElement.query(By.directive(GrandchildComponent));
const grandchildComponentInstance: GrandchildComponent = debugEl.componentInstance;
GrandchildComponent.method();

目标组件

我将使用Jest来测试这个。
根据「开始」部分的说明,我将使用primeNg。
此外,我将使用独立组件进行测试。

HTML (Hypertext Markup Language)是一种用于创建网页的标记语言。

<div>
  <div>first = {{ first }}</div>
  <div>rows = {{ rows }}</div>
  <p-paginator
    (onPageChange)="onPageChange($event)"
    [first]="first"
    [rows]="rows"
    [totalRecords]="120"
  ></p-paginator>
</div>

TypeScript -> TypeScript是 TypeScript

import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { PaginatorModule, PaginatorState } from 'primeng/paginator';

@Component({
  selector: 'app-target',
  standalone: true,
  imports: [CommonModule, PaginatorModule],
  templateUrl: './target.component.html',
  styleUrls: ['./target.component.scss']
})
export class AppTargetComponent {
  first = 0;
  rows = 10;

  onPageChange(event: PaginatorState) {
    this.first = event.first ?? this.first;
  }
}

开玩笑

我们将测试当使用上述组件进行页面跳转时,当发出onPageChange时的行为。我们将使用test paginator进行确认。

import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { Paginator } from 'primeng/paginator';

import { AppTargetComponent } from './target.component';

describe('AppTargetComponent', () => {
  let component: AppTargetComponent;
  let fixture: ComponentFixture<AppTargetComponent>;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [AppTargetComponent],
    });
    fixture = TestBed.createComponent(AppTargetComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

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

  it('test paginator', () => {
    const debugEl = fixture.debugElement.query(By.directive(Paginator));
    const paginatorComponentInstance: Paginator = debugEl.componentInstance;
    paginatorComponentInstance.onPageChange.emit({
      page: 3,
      first: 30,
      rows: 10,
    });
    expect(component.first).toEqual(30);
  });
});

首先

fixture.debugElement.query(By.directive(Paginator));

请从目标组件的DOM中选择p-paginator。
p-paginator 在Paginator和文档中,所以要按原样指定。
但是,这是一个 DebugElement,所以要使用 debugEl.componentInstance 来获取该组件实例。
这样就可以实现类似Angular的ViewChild行为。

然后,我们从组件实例中调用想要调用的方法(在这里,我们希望测试分页时的行为,所以我们调用了OnPageChange被触发的方法)。

onPageChange(event: PaginatorState) {
  this.first = event.first ?? this.first;
}

由于对首值进行了更新,请使用 expect(component.first).toEqual(30) 来确认所需值是否存在,并完成操作。

结束

由於無法找到相關資料,因此我寫了下面的答案。將此作結。

广告
将在 10 秒后关闭
bannerAds