gpt4 book ai didi

angular - 无法使用 CDK 测试线束测试 Angular Material 选择组件

转载 作者:行者123 更新时间:2023-12-03 15:42:38 25 4
gpt4 key购买 nike

我正在尝试为使用 Angular Material Components 的组件编写一些测试。我读到了 CDK 测试工具 https://material.angular.io/guide/using-component-harnesses我想基于此获取 Mat Select 组件中的选项计数。

<mat-card>
<mat-card-content>
<form [formGroup]="filterLikelihoodForm" (ngSubmit)="onSearchClick()">
<div class="container">
<div class="row align-items-center">
<div class="col-sm">
<mat-form-field class="full-width" id="periodField">
<mat-label>Select Period</mat-label>
<mat-select formControlName="period" id="period">
<mat-option *ngFor="let period of periodList" [value]="period.id">
{{ period.monthName }}
</mat-option>
</mat-select>
<mat-error *ngIf="f.period.errors">
Please select a valid period
</mat-error>
</mat-form-field>
</div>
<div class="col-sm">
<mat-form-field class="full-width">
<input
matInput
type="number"
formControlName="finishedDeals"
placeholder="Enter no of finished deals"
/>
<mat-error *ngIf="f.finishedDeals.errors">
Please enter a valid number
</mat-error>
</mat-form-field>
</div>
<div class="col-sm">
<button
mat-flat-button
color="primary"
[disabled]="filterLikelihoodForm.invalid"
class="full-width"
>
Search
</button>
</div>
</div>
</div>
</form>
</mat-card-content>
</mat-card>

这是我的规范文件代码:
import { HarnessLoader } from "@angular/cdk/testing";
import { TestbedHarnessEnvironment } from "@angular/cdk/testing/testbed";
import { TestBed, async, ComponentFixture } from "@angular/core/testing";
import { FilterLikelihoodComponent } from "./filter-likelihood.component";
import { MatFormFieldHarness } from "@angular/material/form-field/testing";
import { MatFormFieldModule } from "@angular/material/form-field";
import { ReactiveFormsModule } from "@angular/forms";
import { MatSelectModule } from "@angular/material/select";
import { MatCardModule } from "@angular/material/card";
import { MatButtonModule } from "@angular/material/button";
import { MatInputModule } from "@angular/material/input";
import { NoopAnimationsModule } from "@angular/platform-browser/animations";
import { periodListMock } from "./mock/filter-likelihood.mock";
import { MatSelectHarness } from "@angular/material/select/testing";
import { MatButtonHarness } from "@angular/material/button/testing";
import { Component } from "@angular/core";
import { MatInputHarness } from "@angular/material/input/testing";

describe("Filter Likelihood Component", () => {
let testHostComponent: TestHostComponent;
let testHostFixture: ComponentFixture<TestHostComponent>;

let component: FilterLikelihoodComponent;
let fixture: ComponentFixture<FilterLikelihoodComponent>;
let loader: HarnessLoader;

beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [FilterLikelihoodComponent, TestHostComponent],
imports: [
ReactiveFormsModule,
MatFormFieldModule,
MatSelectModule,
MatCardModule,
MatButtonModule,
MatInputModule,
NoopAnimationsModule,
],
}).compileComponents();
}));

beforeEach(() => {
testHostFixture = TestBed.createComponent(TestHostComponent);
testHostComponent = testHostFixture.componentInstance;
testHostFixture.detectChanges();

loader = TestbedHarnessEnvironment.loader(testHostFixture);
});

it("should have correct period label", async () => {
const expectedLabel = "Select Period";
const periodFieldHarness = await loader.getHarness<MatFormFieldHarness>(
MatFormFieldHarness.with({ selector: "#periodField" })
);
const actual = await periodFieldHarness.getLabel();
expect(actual).toBe(expectedLabel);
});

it("should have 3 recent periods in the dropdown", async () => {
const expectedCount = 3;
const selectHarness = await loader.getHarness<MatSelectHarness>(
MatSelectHarness
);
const actual = ((await selectHarness.getOptions()).length);
expect(actual).toBe(expectedCount);
});

it("should have a search button", async () => {
const expectedLabel = "Search";
const buttonHarness = await loader.getHarness<MatButtonHarness>(
MatButtonHarness
);
const actual = await buttonHarness.getText();
expect(actual).toBe(expectedLabel);
});

it("should have 10 finished deals by default", async () => {
const expectedFinishedDeals = 10;
const inputHarness = await loader.getHarness<MatInputHarness>(
MatInputHarness
);
const actual = await inputHarness.getValue();
expect(parseInt(actual)).toBe(expectedFinishedDeals);
});

it("should have a enabled button by default", async () => {
const expectedDisabledState = false;
const buttonHarness = await loader.getHarness<MatButtonHarness>(
MatButtonHarness
);
const actual = await buttonHarness.isDisabled();
expect(actual).toBe(expectedDisabledState);
});

@Component({
selector: `host-component`,
template: `<app-filter-likelihood
[periodList]="periodList"
[initialFinishedDeals]="defaultFinishedDeals"
></app-filter-likelihood>`,
})
class TestHostComponent {
periodList = new Helper().mockPeriodList;
defaultFinishedDeals = 10;
}
});

class Helper {
mockPeriodList = periodListMock;
}

标题为 的第二个规范“下拉列表中应该有 3 个最近的周期”失败,因为我始终将选项计数为 0。

有人可以帮我找出我的错误并让我知道使用 Mat 测试工具编写此规范的正确方法吗?

提前致谢!

最佳答案

在对 Select Harness API 进行了一些修补后,我能够解决这个问题。
我已经更新了规范以获取宿主元素,然后触发了一个点击事件。

  it("should have 3 recent periods in the dropdown", async () => {
const expectedCount = 3;
const selectHarness = await loader.getHarness<MatSelectHarness>(
MatSelectHarness
);

//Click the select element host
await (await selectHarness.host()).click();
const actual = (await selectHarness.getOptions()).length;
expect(actual).toBe(expectedCount);
});

关于angular - 无法使用 CDK 测试线束测试 Angular Material 选择组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61143252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com