Angular Testing, dynamically change ActivatedRoute params for different test cases Angular Testing, dynamically change ActivatedRoute params for different test cases angular angular

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'])    });