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

断了今生、忘了曾经 提交于 2019-11-30 04:41:16

Was finally able to fix it, and it was as simple as this:

beforeEach(() => addProviders([
    { 
        provide: Router, 
        useClass: class { navigate = jasmine.createSpy("navigate"); }
    }]));

for me it worked to add the RouterTestingModule

  import { RouterTestingModule } from '@angular/router/testing';

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        RouterTestingModule
      ],
      declarations: [ HomeComponent ]
    })
    .compileComponents();
  }));
masterwok

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

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
        ]              

    });

Try adding RouterModule:

import { ROUTER_DIRECTIVES, Router, RouterModule } from '@angular/router';

beforeEach(() => {
        TestBed.configureTestingModule({
            providers: [
                 ...
                {provide: Router, useClass: RouterModule},
        });
    });

I just had to remove the router from the providers. That was causing the problem for me.

I was getting the same error, importing RouterTestModule in my imports array, and removing Router/ActivatedRoute from providers and also removing RouterModule from my imports array helped me to get over this issue.

This is how my working version looks like

import { RouterTestingModule } from '@angular/router/testing';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { FormsModule } from '@angular/forms';
import { MyAppComponent } from './my-apppp.component';
import { MyAppService } from '../../../services/my-app.service';
import { NO_ERRORS_SCHEMA} from '@angular/core';

 beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ MyAppComponent ],
      schemas:      [NO_ERRORS_SCHEMA],
      imports: [ FormsModule, RouterTestingModule ],
      providers: [ MyAppService ]
    })
    .compileComponents();
  }));

I know a lot of people already commented in here, but I felt like providing a updated answer would be helpful.

Thanks!

For latest Angular 7, here is the solution that worked for me. The example is copied from latest angular docs.

app/dashboard/dashboard.component.spec.ts (spies)

const routerSpy = jasmine.createSpyObj('Router', ['navigateByUrl']);
const heroServiceSpy = jasmine.createSpyObj('HeroService', ['getHeroes']);

TestBed.configureTestingModule({
  providers: [
    { provide: HeroService, useValue: heroServiceSpy },
    { provide: Router,      useValue: routerSpy }
  ]
})

app/dashboard/dashboard.component.spec.ts (navigate test)

it('should tell ROUTER to navigate when hero clicked', () => {

  heroClick(); // trigger click on first inner <div class="hero">

  // args passed to router.navigateByUrl() spy
  const spy = router.navigateByUrl as jasmine.Spy;
  const navArgs = spy.calls.first().args[0];

  // expecting to navigate to id of the component's first hero
  const id = comp.heroes[0].id;
  expect(navArgs).toBe('/heroes/' + id,
    'should nav to HeroDetail for first hero');
});
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!