I need to test part of a method in my app component, that does a forEach of events in the router. The Karma coverage says that i need to test some lines of this method i dont know how to achieve it. How can i mock router events?
App.component
ngOnInit(): void {
// Google tag manager
this.pushGTMDataLayerForEveryVisitedPage();
}
pushGTMDataLayerForEveryVisitedPage() {
// push GTM data layer for every visited page
this.router.events.forEach(item => {
if (item instanceof NavigationEnd) {
const gtmTag = {
event: 'page',
pageName: item.url
};
this.gtmService.pushTag(gtmTag);
}
});
}
unit test
describe('AppComponent', () => {
let component: AppComponent;
let fixture: ComponentFixture<AppComponent>;
let store: MockStore<ILoaderState>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [
RouterTestingModule,
TranslateModule.forRoot(),
GoogleTagManagerModule.forRoot({
id: environment.GTM_ID
})
],
declarations: [
AppComponent
],
providers: [
PrimeNGConfig,
provideMockStore(),
GoogleTagManagerService
]
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(AppComponent);
store = TestBed.inject(MockStore);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('GTM Is called',() => {
component.isProduction = true
const googleManagerSpy = spyOn(component, 'pushGTMDataLayerForEveryVisitedPage').and.callThrough();
component.ngOnInit()
expect(googleManagerSpy).toHaveBeenCalledTimes(1);
})
For now im only evaluating that the method is called, but i dont know how to test those specific lines