75 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			75 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | /** | ||
|  |  * @license | ||
|  |  * Copyright Google Inc. All Rights Reserved. | ||
|  |  * | ||
|  |  * Use of this source code is governed by an MIT-style license that can be | ||
|  |  * found in the LICENSE file at https://angular.io/license
 | ||
|  |  */ | ||
|  | 
 | ||
|  | import {CommonModule} from '@angular/common'; | ||
|  | import {Component, NgModule, Type} from '@angular/core'; | ||
|  | import {ComponentFixture, TestBed, fakeAsync, tick} from '@angular/core/testing'; | ||
|  | import {Router} from '@angular/router'; | ||
|  | import {RouterTestingModule} from '@angular/router/testing'; | ||
|  | 
 | ||
|  | describe('Integration', () => { | ||
|  | 
 | ||
|  |   describe('routerLinkActive', () => { | ||
|  |     it('should not cause infinite loops in the change detection - #15825', fakeAsync(() => { | ||
|  |          @Component({selector: 'simple', template: 'simple'}) | ||
|  |          class SimpleCmp { | ||
|  |          } | ||
|  | 
 | ||
|  |          @Component({ | ||
|  |            selector: 'some-root', | ||
|  |            template: `
 | ||
|  |         <div *ngIf="show"> | ||
|  |           <ng-container *ngTemplateOutlet="tpl"></ng-container> | ||
|  |         </div> | ||
|  |         <router-outlet></router-outlet> | ||
|  |         <ng-template #tpl> | ||
|  |           <a routerLink="/simple" routerLinkActive="active"></a> | ||
|  |         </ng-template>` | ||
|  |          }) | ||
|  |          class MyCmp { | ||
|  |            show: boolean = false; | ||
|  |          } | ||
|  | 
 | ||
|  |          @NgModule({ | ||
|  |            imports: [CommonModule, RouterTestingModule], | ||
|  |            declarations: [MyCmp, SimpleCmp], | ||
|  |            entryComponents: [SimpleCmp], | ||
|  |          }) | ||
|  |          class MyModule { | ||
|  |          } | ||
|  | 
 | ||
|  |          TestBed.configureTestingModule({imports: [MyModule]}); | ||
|  | 
 | ||
|  |          const router: Router = TestBed.get(Router); | ||
|  |          const fixture = createRoot(router, MyCmp); | ||
|  |          router.resetConfig([{path: 'simple', component: SimpleCmp}]); | ||
|  | 
 | ||
|  |          router.navigateByUrl('/simple'); | ||
|  |          advance(fixture); | ||
|  | 
 | ||
|  |          const instance = fixture.componentInstance; | ||
|  |          instance.show = true; | ||
|  |          expect(() => advance(fixture)).not.toThrow(); | ||
|  |        })); | ||
|  |   }); | ||
|  | 
 | ||
|  | }); | ||
|  | 
 | ||
|  | function advance<T>(fixture: ComponentFixture<T>): void { | ||
|  |   tick(); | ||
|  |   fixture.detectChanges(); | ||
|  | } | ||
|  | 
 | ||
|  | function createRoot<T>(router: Router, type: Type<T>): ComponentFixture<T> { | ||
|  |   const f = TestBed.createComponent(type); | ||
|  |   advance(f); | ||
|  |   router.initialNavigation(); | ||
|  |   advance(f); | ||
|  |   return f; | ||
|  | } |