/
githubmirror
/
components
Обзор
Документация
Войти
/
githubmirror
/
components
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/material/input/testing/native-select-harness.spec.ts
234 строки
8 KB
Kristiyan Kostadinov
build: add explicit change detection to tests (#33010)
30 мар 2026, 10:52
Не верифицирован
30 мар 2026, 10:52
7806398
Код
Авторство
О чём код?
import {Component, signal, ChangeDetectionStrategy} from '@angular/core'; import {ComponentFixture, TestBed} from '@angular/core/testing'; import {HarnessLoader, parallel} from '@angular/cdk/testing'; import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; import {FormsModule} from '@angular/forms'; import {MatInputModule} from '../input-module'; import {MatNativeSelectHarness} from './native-select-harness'; describe('MatNativeSelectHarness', () => { let fixture: ComponentFixture<SelectHarnessTest>; let loader: HarnessLoader; beforeEach(() => { fixture = TestBed.createComponent(SelectHarnessTest); fixture.detectChanges(); loader = TestbedHarnessEnvironment.loader(fixture); }); it('should load all select harnesses', async () => { const selects = await loader.getAllHarnesses(MatNativeSelectHarness); expect(selects.length).toBe(2); }); it('should load select with a specific label', async () => { const inputs = await loader.getAllHarnesses( MatNativeSelectHarness.with({label: 'Favorite food'}), ); expect(inputs.length).toBe(1); }); it('should get the id of a select', async () => { const selects = await loader.getAllHarnesses(MatNativeSelectHarness); expect(await parallel(() => selects.map(select => select.getId()))).toEqual(['food', 'drink']); }); it('should get the name of a select', async () => { const selects = await loader.getAllHarnesses(MatNativeSelectHarness); expect(await parallel(() => selects.map(select => select.getName()))).toEqual([ 'favorite-food', 'favorite-drink', ]); }); it('should get whether a select is disabled', async () => { const selects = await loader.getAllHarnesses(MatNativeSelectHarness); expect( await parallel(() => { return selects.map(select => select.isDisabled()); }), ).toEqual([false, false]); fixture.componentInstance.favoriteDrinkDisabled.set(true); expect(await parallel(() => selects.map(select => select.isDisabled()))).toEqual([false, true]); }); it('should get whether the select is in multi-selection mode', async () => { const selects = await loader.getAllHarnesses(MatNativeSelectHarness); expect(await parallel(() => selects.map(select => select.isMultiple()))).toEqual([false, true]); }); it('should get whether a select is required', async () => { const selects = await loader.getAllHarnesses(MatNativeSelectHarness); expect( await parallel(() => { return selects.map(select => select.isRequired()); }), ).toEqual([false, false]); fixture.componentInstance.favoriteFoodRequired.set(true); expect(await parallel(() => selects.map(select => select.isRequired()))).toEqual([true, false]); }); it('should be able to focus a select', async () => { const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#food'})); expect(await select.isFocused()).toBe(false); await select.focus(); expect(await select.isFocused()).toBe(true); }); it('should be able to blur a select', async () => { const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#food'})); expect(await select.isFocused()).toBe(false); await select.focus(); expect(await select.isFocused()).toBe(true); await select.blur(); expect(await select.isFocused()).toBe(false); }); it('should get the options of a select', async () => { const selects = await loader.getAllHarnesses(MatNativeSelectHarness); const options = await parallel(() => selects.map(select => select.getOptions())); expect(options.length).toBe(2); expect(options[0].length).toBe(3); expect(options[1].length).toBe(4); }); it('should select an option inside of a single-selection select', async () => { const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#food'})); expect(fixture.componentInstance.favoriteFood).toBeFalsy(); await select.selectOptions({text: 'Ramen'}); expect(fixture.componentInstance.favoriteFood).toBe('ramen'); }); it('should select an option inside of a multi-selection select', async () => { const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#drink'})); expect(fixture.componentInstance.favoriteDrink).toEqual([]); await select.selectOptions({text: /Water|Juice/}); expect(fixture.componentInstance.favoriteDrink).toEqual(['water', 'juice']); }); it('should get the text of select options', async () => { const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#drink'})); const options = await select.getOptions(); expect(await parallel(() => options.map(option => option.getText()))).toEqual([ 'Water', 'Soda', 'Coffee', 'Juice', ]); }); it('should get the index of select options', async () => { const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#food'})); const options = await select.getOptions(); expect(await parallel(() => options.map(option => option.getIndex()))).toEqual([0, 1, 2]); }); it('should get the disabled state of select options', async () => { const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#food'})); const options = await select.getOptions(); expect(await parallel(() => options.map(option => option.isDisabled()))).toEqual([ false, false, false, ]); fixture.componentInstance.pastaDisabled.set(true); expect(await parallel(() => options.map(option => option.isDisabled()))).toEqual([ false, true, false, ]); }); it('should get the selected state of an option in a single-selection list', async () => { const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#food'})); const options = await select.getOptions(); expect(await parallel(() => options.map(option => option.isSelected()))).toEqual([ false, false, false, ]); await select.selectOptions({index: 2}); expect(await parallel(() => options.map(option => option.isSelected()))).toEqual([ false, false, true, ]); }); it('should get the selected state of an option in a multi-selection list', async () => { const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#drink'})); const options = await select.getOptions(); expect(await parallel(() => options.map(option => option.isSelected()))).toEqual([ false, false, false, false, ]); await select.selectOptions({text: /Water|Coffee/}); expect(await parallel(() => options.map(option => option.isSelected()))).toEqual([ true, false, true, false, ]); }); }); @Component({ template: ` <mat-form-field> <mat-label>Favorite food</mat-label> <select id="food" matNativeControl name="favorite-food" [(ngModel)]="favoriteFood" [required]="favoriteFoodRequired()"> <option value="pizza">Pizza</option> <option value="pasta" [disabled]="pastaDisabled()">Pasta</option> <option value="ramen">Ramen</option> </select> </mat-form-field> <mat-form-field> <select id="drink" matNativeControl name="favorite-drink" [(ngModel)]="favoriteDrink" [disabled]="favoriteDrinkDisabled()" multiple> <option value="water">Water</option> <option value="soda">Soda</option> <option value="coffee">Coffee</option> <option value="juice">Juice</option> </select> </mat-form-field> `, imports: [MatInputModule, FormsModule], changeDetection: ChangeDetectionStrategy.Eager, }) class SelectHarnessTest { favoriteFood!: string; favoriteDrink: string[] = []; favoriteFoodRequired = signal(false); favoriteDrinkDisabled = signal(false); pastaDisabled = signal(false); }