Angular Testing, dynamically change ActivatedRoute params for different test cases
You can get it with TestBed.get(ActivatedRoute)
in your it functions if you want to stock it in a variable. You can update value also.
From Karma v9.0.0 at the angular's newest versions the TestBed.get
method is deprecated
if you are not using testBed
then use this line of code:
in the beforeEach
method, the activatedRoute
mock should be defined as follows:
activatedRoute = {queryParams: of({id: 1})};
then in your it method, update the activatedRoute to:
activatedRoute.queryParams = of({id: 2})};
There is an alternative with a stub class. Follow bellow the approach.
Declare a stub class
class ActivatedRouteStub { private _params = new Subject<any>(); get params() { return this._params.asObservable(); } public push(value) { this._params.next(value); }}
In your beforeEach declare an alias for the activated route provider
beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ RouterTestingModule ], declarations: [YourComponentComponent], providers: [ { provide: ActivatedRoute, useClass: ActivatedRouteStub } ] }) .compileComponents(); }));
And you can use it anywhere you desire. Bellow example in "it" test.
it('should show example, how to set parameters', () => { let spy = spyOn(router, 'navigate'); // here we pass the any parameter for return and type the route variable with the stub class let route: ActivatedRouteStub = TestBed.inject<any>(ActivatedRoute); // you can push the parameters like you desire. route.push({id: 0}) expect(spy).toHaveBeenCalledWith(['not-found']) });