I'm trying to unit test a (angular 2) component with routerLink
and routerLinkActive
but all test cases fail with following error message. (Note: I have stubbed the router and other related dependencies. Here's the reference that I used for the same.).
Cannot read property 'subscribe' of undefined
I have also noticed that when routerLink
and routerLinkActive
are removed from my template, all test cases will run without any errors.
I think the error is caused by either RouterTestingModule
or SharedModule
(contains component for displaying and validating password input field). So I tried removing or adding them to find which is actually causing the problem. Here's what I observed.
- I get '
Cannot read property 'subscribe' of undefined'
ifRouterTestingModule
orSharedModule
is present. - I do not get any error linked to router only if I remove both
RouterTestingModule
andSharedModules
but the elements from theSharedModules
would not get loaded in the component and some test cases still fail because of that.
TestBed configuration:
TestBed.configureTestingModule({
imports: [CoreModule,SharedModule,RouterTestingModule],
declarations: [ MyComponent,RouterLinkStubDirective,RouterOutletStubComponent ],
providers: [
FormBuilder,
{ provide: Router, useClass: RouterStub },
{ provide: ActivatedRoute, userClass: ActivatedRouteStub}
],
schemas: [NO_ERRORS_SCHEMA]
})
.overrideComponent(MyComponent, {
set: {
providers: [
{provide: AuthModel, useClass: MockAuthModel}
],
}
})
.compileComponents();
}));
ActivatedRouterStub:
@Injectable()
export class ActivatedRouteStub {
// ActivatedRoute.params is Observable
private subject = new BehaviorSubject(this.testParams);
params = this.subject.asObservable();
// Test parameters
private _testParams: {};
get testParams() { return this._testParams; }
set testParams(params: {}) {
this._testParams = params;
this.subject.next(params);
}
// ActivatedRoute.snapshot.params
get snapshot() {
return { params: this.testParams };
}
}
What changes should I make to solve the issue?