How to do unit testing for getCurrentNavigation().extras.state in angular 7
You can easily do it using stub
& useClass
which can be reused at other spec
files as well if you can create it in separate file and export class RouterStub
, try:
In spec
file create a stub
which will have same method as Router
:
class RouterStub{
getCurrentNavigation(){
return {
extras: {
state:{
locationId: 'someId',
locationName: 'someName'
}
}
}
}
}
and in beforeEach()
block:
describe('LocationListComponent ', () => {
let component: LocationListComponent ;
let fixture: ComponentFixture<LocationListComponent >;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
LocationListComponent
],
providers: [ {provide: Router, useClass: RouterStub}]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(LocationListComponent );
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
If we try to use both RouterTestingModule
and {provide: Router, useClass: RouterStub}
it will throw error of cannot read property 'root' of undefined
So we can directly create spy for Route and return value of it
describe('LocationListComponent', () => {
let component: LocationListComponent ;
let fixture: ComponentFixture<LocationListComponent>;
let router: jasmine.SpyObj<Router>;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
LocationListComponent
],
})
.compileComponents();
}));
beforeEach(() => {
router = TestBed.get(Router);
spyOn(router, 'getCurrentNavigation').and.returnValue({ extras: { state: { message: 'msg'} } } as any);
fixture = TestBed.createComponent(LocationListComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});