在Angular单个的单元测试里,调用多次detectChange,会重复执行ngAfterViewInit hook吗

简介: 在Angular单个的单元测试里,调用多次detectChange,会重复执行ngAfterViewInit hook吗

我的单元测试源代码:import { Component } from '@angular/core';

import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';

import { By } from '@angular/platform-browser';

import { FocusDirective } from './focus.directive';

import { KeyboardFocusService } from './services';

/*

 After cxFocus is enhanced with refreshFocus feature, an element will be focused twice when the page is displayed for the FIRST time:  

 1. in ngOnChanges hook

 2. in ngAfterViewInit hook

 

 Once the page is rendered, all subsequent operations will only cause element to be focused once in ngOnChanges, because ngAfterViewInit then will not be triggered any more.  

*/

const ELEMENT_FOCUSED_TIME = 2;

@Component({

 selector: 'cx-host',

 template: `

   id="a"

   [cxFocus]="{ autofocus: true, refreshFocus: modelA }"

 >

`,

})

class MockComponent {

 modelA = 'A';

 modelB = 'B';

}

class MockKeyboardFocusService {

 get() {}

 set() {}

 shouldFocus() {}

 getPersistenceGroup() {}

 findFirstFocusable() {}

 hasPersistedFocus() {}

}

describe('FocusDirective', () => {

 let component: MockComponent;

 let fixture: ComponentFixture;

 let keyboardFocusService: KeyboardFocusService;

 beforeEach(

   waitForAsync(() => {

     TestBed.configureTestingModule({

       declarations: [FocusDirective, MockComponent],

       providers: [

         {

           provide: KeyboardFocusService,

           useClass: MockKeyboardFocusService,

         },

       ],

     }).compileComponents();

     fixture = TestBed.createComponent(MockComponent);

     component = fixture.componentInstance;

     keyboardFocusService = TestBed.inject(KeyboardFocusService);

   })

 );

 it('should be created', () => {

   expect(component).toBeTruthy();

 });

 it('should default tabindex to -1', () => {

   const el: HTMLElement = fixture.debugElement.query(By.css('#a'))

     .nativeElement;

   fixture.detectChanges();

   expect(el.getAttribute('tabindex')).toEqual('-1');

 });

 it('should focus element marked with autofocus = true', () => {

   const el: HTMLElement = fixture.debugElement.query(By.css('#a'))

     .nativeElement;

   spyOn(keyboardFocusService, 'findFirstFocusable').and.returnValue(el);

   fixture.detectChanges();

   expect(document.activeElement.id).toEqual('a');

 });

 it('should only refresh focus with change on configured attribute', () => {

   const el: HTMLElement = fixture.debugElement.query(By.css('#a'))

     .nativeElement;

   let spiedFirstFocusable = spyOn(

     keyboardFocusService,

     'findFirstFocusable'

   ).and.returnValue(el);

   fixture.detectChanges();

   expect(document.activeElement.id).toEqual('a');

   expect(spiedFirstFocusable).toHaveBeenCalledTimes(ELEMENT_FOCUSED_TIME);

   component.modelB = '1';

   fixture.detectChanges();

   expect(spiedFirstFocusable).toHaveBeenCalledTimes(ELEMENT_FOCUSED_TIME);

   component.modelA = '1';

   fixture.detectChanges();

   expect(spiedFirstFocusable).toHaveBeenCalledTimes(ELEMENT_FOCUSED_TIME + 1);

 });

});image.png执行到refreshView时,由于之前已经执行过fixture.detectChange, 因此第7225行hooksInitPhaseCompleted这个标志位为true了,因此会执行AfterViewChecked hook,而不是else 分支内的AfterViewInit hook:


image.png

相关文章
|
7月前
|
前端开发 测试技术
关于 fakeAsync 在 Angular 应用单元测试开发领域的使用介绍
关于 fakeAsync 在 Angular 应用单元测试开发领域的使用介绍
38 0
|
7月前
|
测试技术 开发者
关于 Angular testing 开发包里 fakeAsync 测试工具的用法
关于 Angular testing 开发包里 fakeAsync 测试工具的用法
21 0
|
弹性计算 编解码 资源调度
我与无影的初体验:使用无影云桌面进行一个开源 Angular 项目的端到端测试
近日很荣幸地收到了阿里云邀请做一个关于阿里旗下无影云桌面的评测,从官网上了解到阿里云无影云桌面原名为弹性云桌面,融合了无影产品技术后更名升级,可广泛应用于具有高数据安全管控、高性能计算等要求的安全办公、金融、设计、影视、教育等领域。
352 0
我与无影的初体验:使用无影云桌面进行一个开源 Angular 项目的端到端测试
|
Web App开发 编解码 资源调度
我与无影的初体验:使用无影云桌面进行一个开源 Angular 项目的端到端测试
一个 Angular 程序员与无影云桌面第一次亲密接触的体验。
61512 2
我与无影的初体验:使用无影云桌面进行一个开源 Angular 项目的端到端测试
|
存储 测试技术 API
Angular 依赖的测试和 Fake
Angular 依赖的测试和 Fake
149 0
Angular 依赖的测试和 Fake
|
JavaScript 前端开发 测试技术
关于Angular里给Component protected方法写单元测试的技巧
关于Angular里给Component protected方法写单元测试的技巧
172 0
关于Angular里给Component protected方法写单元测试的技巧
|
Java 测试技术
如何在Angular单元测试里,对class protected方法进行测试
我的service class里有一个protected方法,我想在单元测试里对其进行测试:
如何在Angular单元测试里,对class protected方法进行测试
|
测试技术
Angular单元测试框架beforeEach和it的执行顺序
Angular单元测试框架beforeEach和it的执行顺序
Angular单元测试框架beforeEach和it的执行顺序