Daniel
Daniel

Reputation: 1169

Angular 7 Test: NullInjectorError: No provider for ActivatedRoute

Hi have some error with testing my App made with Angular 7. I do not have much experience in angular, so I would need your help+

Error: StaticInjectorError(DynamicTestModule)[BeerDetailsComponent -> ActivatedRoute]: 
  StaticInjectorError(Platform: core)[BeerDetailsComponent -> ActivatedRoute]: 
    NullInjectorError: No provider for ActivatedRoute!

the testing code is like this:

import { async, ComponentFixture, TestBed, inject } from '@angular/core/testing';
import { BeerDetailsComponent } from './beer-details.component';
import {
  HttpClientTestingModule,
  HttpTestingController
} from '@angular/common/http/testing';

describe('BeerDetailsComponent', () => {
  let component: BeerDetailsComponent;
  let fixture: ComponentFixture<BeerDetailsComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      declarations: [ BeerDetailsComponent ]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(BeerDetailsComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create',
  inject(
    [HttpTestingController],
    () => {
      expect(component).toBeTruthy();
    }
  )
)
});

I really can't find any solution.

Daniele

Upvotes: 116

Views: 144628

Answers (7)

kimbaudi
kimbaudi

Reputation: 15615

RouterTestingModule is deprecated. Use providerRouter or RouterModule.forRoot instead. The accepted answer uses RouterModule.forRoot. If you want to use providerRouter instead, add providers: [provideRouter([])] below imports

import { provideRouter } from '@angular/router';

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [ AppComponent ],
      providers: [provideRouter([])],
    }).compileComponents();
  }

Upvotes: 20

Oussema Miled
Oussema Miled

Reputation: 618

July 2024

Adding RouterModule to the imports worked for me:

await TestBed.configureTestingModule({
      declarations: [TestComponent],
      providers: [
        ...
        {
          provide: ActivatedRoute,
          useValue: {
            queryParams: of({ param1: 'value1'}),
          },
        },
      ],
  imports: [RouterModule],
}).compileComponents();

Upvotes: 1

Prathvi Shetty
Prathvi Shetty

Reputation: 373

This issue can be fixed as follows:

  1. In your corresponding spec.ts file import RouterTestingModule

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

  2. In the same file add RouterTestingModule as one of the imports

     beforeEach(() => {
        TestBed.configureTestingModule({
        imports: [RouterTestingModule],
        providers: [Service]
      });
     });
    

Upvotes: 24

Mark Hendriks
Mark Hendriks

Reputation: 439

I had this error for some time as well while testing, and none of these answers really helped me. What fixed it for me was importing both the RouterTestingModule and the HttpClientTestingModule.

So essentially it would look like this in your whatever.component.spec.ts file.

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

You can get the imports from

import { RouterTestingModule } from "@angular/router/testing";
import { HttpClientTestingModule } from "@angular/common/http/testing";

I dont know if this is the best solution, but this worked for me.

Upvotes: 31

Cherma Ramalho
Cherma Ramalho

Reputation: 395

Example of a simple test using the service and ActivatedRoute! Good luck!

    import { async, ComponentFixture, TestBed } from '@angular/core/testing';
    import { RouterTestingModule } from '@angular/router/testing';
    import { HttpClientModule } from '@angular/common/http';
    import { MyComponent } from './my.component';
    import { ActivatedRoute } from '@angular/router';
    import { MyService } from '../../core/services/my.service';


    describe('MyComponent class test', () => {
    let component: MyComponent;
    let fixture: ComponentFixture<MyComponent>;
    let teste: MyComponent;
    let route: ActivatedRoute;
    let myService: MyService;

    beforeEach(async(() => {
        teste = new MyComponent(route, myService);
        TestBed.configureTestingModule({
        declarations: [ MyComponent ],
        imports: [
            RouterTestingModule,
            HttpClientModule
        ],
        providers: [MyService]
        })
        .compileComponents();
    }));

    beforeEach(() => {
        fixture = TestBed.createComponent(MyComponent);
        component = fixture.componentInstance;
        fixture.detectChanges();
    });

    it('Checks if the class was created', () => {
        expect(component).toBeTruthy();
    });

    });

Upvotes: 8

RaulDanielPopa
RaulDanielPopa

Reputation: 1599

You have to import RouterTestingModule

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

imports: [
    ...
    RouterTestingModule
    ...
]

Upvotes: 156

Sachila Ranawaka
Sachila Ranawaka

Reputation: 41445

Add the following import

  imports: [ 
    RouterModule.forRoot([]),
    ...
  ],

Upvotes: 83

Related Questions