Can't resolve all parameters for Router: (?, ?, ?, ?, ?, ?, ?) in Angular RC 5 when unit testing
Solution 1
Was finally able to fix it, and it was as simple as this:
beforeEach(() => addProviders([
{
provide: Router,
useClass: class { navigate = jasmine.createSpy("navigate"); }
}]));
Solution 2
for me it worked to add the RouterTestingModule
import { RouterTestingModule } from '@angular/router/testing';
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [ HomeComponent ]
})
.compileComponents();
}));
Solution 3
In my case, I had Router in providers and RouterTestingModule in imports. Guess this was causing a conflict. The following configuration worked:
TestBed.configureTestingModule({
declarations: [Component],
imports: [
RouterTestingModule,
],
providers: [
... //Remove Router from providers
]
});
Solution 4
I did not have any luck with the above solutions. Instead, I followed the recommended approach in the official documentation: Testing Routed Components
First, create a stubbed router with whatever methods your component calls:
class RouterStub {
navigateByUrl(url: string) {
return url;
}
}
Then, when configuring your testing module you do the following:
TestBed.configureTestingModule({
declarations: [HeaderComponent],
providers: [
{provide: Router, useClass: RouterStub}
]
});
Solution 5
Try adding RouterModule:
import { ROUTER_DIRECTIVES, Router, RouterModule } from '@angular/router';
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
...
{provide: Router, useClass: RouterModule},
});
});
ganjan
Updated on February 15, 2020Comments
-
ganjan about 4 years
I just upgraded to Angular RC 5 and now all component that uses 'ROUTER_DIRECTIVES' fails with 'Can't resolve all parameters for Router: (?, ?, ?, ?, ?, ?, ?)' when I try to unit test the component.
import { inject, addProviders } from '@angular/core/testing'; import { ComponentFixture, TestComponentBuilder } from '@angular/core/testing'; import { Component } from '@angular/core'; import { ROUTER_DIRECTIVES, Router } from '@angular/router'; import { HomeComponent } from './home.component'; import { UserService } from '../_services/user.service'; describe('Component: Home', () => { beforeEach(() => { addProviders([HomeComponent, UserService, ROUTER_DIRECTIVES, Router]); }); it('should inject the component', inject([HomeComponent, UserService, ROUTER_DIRECTIVES, Router], (component: HomeComponent) => { expect(component).toBeTruthy(); // expect(component.currentUser.firstname).toEqual('Jan'); }));
The full error log:
Chrome 52.0.2743 (Windows 10 0.0.0) Error: Can't resolve all parameters for Router: (?, ?, ?, ?, ?, ?, ?). at new BaseException (webpack:///C:/ng/anbud/~/@angular/compiler/src/facade/exceptions.js:27:0 <- src/test.ts:2943:23) at CompileMetadataResolver.getDependenciesMetadata (webpack:///C:/ng/anbud/~/@angular/compiler/src/metadata_resolver.js:551:0 <- src/test.ts:24542:19) at CompileMetadataResolver.getTypeMetadata (webpack:///C:/ng/anbud/~/@angular/compiler/src/metadata_resolver.js:448:0 <- src/test.ts:24439:26) at webpack:///C:/ng/anbud/~/@angular/compiler/src/metadata_resolver.js:594:0 <- src/test.ts:24585:41 at Array.forEach (native) at CompileMetadataResolver.getProvidersMetadata (webpack:///C:/ng/anbud/~/@angular/compiler/src/metadata_resolver.js:575:0 <- src/test.ts:24566:19) at CompileMetadataResolver.getNgModuleMetadata (webpack:///C:/ng/anbud/~/@angular/compiler/src/metadata_resolver.js:305:0 <- src/test.ts:24296:58) at RuntimeCompiler._compileComponents (webpack:///C:/ng/anbud/~/@angular/compiler/src/runtime_compiler.js:150:0 <- src/test.ts:37986:47) at RuntimeCompiler._compileModuleAndAllComponents (webpack:///C:/ng/anbud/~/@angular/compiler/src/runtime_compiler.js:78:0 <- src/test.ts:37914:37) at RuntimeCompiler.compileModuleAndAllComponentsSync (webpack:///C:/ng/anbud/~/@angular/compiler/src/runtime_compiler.js:52:0 <- src/test.ts:37888:21)
Any ideas how to unit test components with routing?