45 votes

Test Angular 7 : NullInjectorError : Aucun fournisseur pour ActivatedRoute

J'ai une erreur lors du test de mon application réalisée avec Angular 7. Je n'ai pas beaucoup d'expérience en angular, donc j'aurais besoin de votre aide+.

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

le code de test est comme ceci :

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

Je ne trouve vraiment pas de solution.

Daniele

69voto

RaulDanielPopa Points 641

Vous devez importer RouterTestingModule

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

imports: [
    ...
    RouterTestingModule
    ...
]

0 votes

Quand je fais cela, je commence à obtenir l'erreur NullInjectorError: No provider for ActivatedRoute!

0 votes

Avez-vous importé ce module dans le fichier spec ?

0 votes

Je pense que la solution était d'ajouter un fournisseur pour la route, en utilisant un objet anonyme contenant les propriétés auxquelles le test a accès.

50voto

Sachila Ranawaka Points 17611

Ajoutez l'importation suivante

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

2 votes

Où dois-je importer RouterModule.forRoot([]), ?

5 votes

Dans le module import { RouterModule } from '@angular/router';

0 votes

:) assurez-vous que la vérification comme réponse si cela a aidé.

16voto

Mark Hendriks Points 33

J'ai également eu cette erreur pendant un certain temps lors de tests, et aucune de ces réponses ne m'a vraiment aidé. Ce qui l'a résolu pour moi a été d'importer à la fois le RouterTestingModule et le HttpClientTestingModule.

Donc, essentiellement, cela ressemblerait à ceci dans votre fichier whatever.component.spec.ts.

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

Vous pouvez obtenir les importations à partir de

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

Je ne sais pas si c'est la meilleure solution, mais cela a fonctionné pour moi.

9voto

Prathvi Shetty Points 93

Ce problème peut être résolu comme suit :

  1. Dans votre correspondance spec.ts fichier d'importation RouterTestingModule

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

  2. Dans le même fichier, ajoutez RouterTestingModule comme l'une des importations

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

6voto

Cherma Ramalho Points 69

Exemple d'un test simple utilisant le service et ActivatedRoute ! Bonne chance !

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

    });

1 votes

Utilisez-vous teste n'importe où ? pour quoi faire ?

0 votes

Je l'utilise partout où je travaille. C'est un moyen de s'assurer que l'application continue de fonctionner après un changement sans casser mon code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X