Can't resolve all parameters for Router: (?, ?, ?, ?, ?, ?, ?) in Angular RC 5 when unit testing

40,321

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},
        });
    });
Share:
40,321
ganjan
Author by

ganjan

Updated on February 15, 2020

Comments

  • ganjan
    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?