I am unit testing a component that is used to edit an object. The object has an unique id
that is used in order to grab the specific object from an array of objects that are hosted in a service. The specific id
is procured through a parameter that is passed via routing, specifically through the ActivatedRoute
class.
The constructor is as follows:
constructor(private _router:Router, private _curRoute:ActivatedRoute, private _session:Session) {
}
ngOnInit() {
this._curRoute.params.subscribe(params => {
this.userId = params['id'];
this.userObj = this._session.allUsers.filter(user => user.id.toString() === this.userId.toString())[0];
I want to run basic unit tests on this component. However, I am not sure as to how I can inject the id
parameter, and the component needs this parameter.
By the way: I already have a mock for the Session
service, so no worries there.
I have figured out how to do this!
Since
ActivatedRoute
is a service, a mock service for it can be established. Let's call this mock serviceMockActivatedRoute
. We will extendActivatedRoute
inMockActivatedRoute
, as follows:The line
super(null, ....)
initializes the super class, which has four mandatory parameters. However, in this instance, we need nothing from any of these parameters, so we initialize them tonull
values. All we need is the value ofparams
which is anObservable<>
. Therefore, withthis.params
, we override the value ofparams
and initialize it to be theObservable<>
of the parameter on which the test subject is relying.Then, as any other mock service, just initialize it and override the provider for the component.
Good luck!
Just add a mock of the ActivatedRoute:
...
Here is how I tested it in angular 2.0 latest...
and in Providers section
The simplest way to do this is to just use the
useValue
attribute and provide an Observable of the value you want to mock.