web-dev-qa-db-fra.com

Angular Material et Jasmine: "Aucun fournisseur pour InjectionToken MdDialogData!"

J'ai un composant destiné à être utilisé dans un Angular Material MdDialog:

@Component({
  ...
})
export class MyComponent {

  constructor(@Inject(MD_DIALOG_DATA) public data: any, public dialogRef: 
MdDialogRef<MyComponent>) {
...
  }


}

J'essaie de le tester à l'unité avec Jasmine:

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

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

  ...

});

Malheureusement, j'obtiens l'erreur suivante:

Erreur: Pas de fournisseur pour InjectionToken MdDialogData!

SharedTestingModule importe et exporte mon module personnalisé Angular Material, qui importe et exporte lui-même MdDialogModule.

Comment puis-je me débarrasser de cette erreur?

Merci beaucoup!

Angular 4.2.4
Angular Material 2.0.0-beta.7
Jasmine 2.5.3
34
Wenneguen

J'ai ajouté ceci:

providers: [
    { provide: MD_DIALOG_DATA, useValue: {} },
    { provide: MdDialogRef, useValue: {} }
]

Et il fonctionne :)

Merci pour votre aide @methgaard!

63
Wenneguen

Pour Angular 5 avec le dernier composant matériel

 import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';

et

 providers: [
     { provide: MAT_DIALOG_DATA, useValue: {} },
     { provide: MatDialogRef, useValue: {} }
 ]
48
Kamruzzaman

essaye ça

beforeEach(async(() => {
 TestBed.configureTestingModule({
   imports: [
     SharedTestingModule,
   ],
   declarations: [
     MyComponent,
   ],
   providers: [ <-- here
    {
     provide: MdDialogData,
     useValue: {},
    }
   ] <-- to here 
 })
 .compileComponents();
}));

laissez-moi savoir comment ça se passe

9
methgaard

en tant que mise à jour, ceci est également répliqué pour ceux qui utilisent les balises avec le préfixe "Mat"

providers: [{provide: MAT_DIALOG_DATA, useValue: {}}, 
{provide: MatDialogRef, useValue: {}}]
9
mehs2690

vous pouvez injecter MAT_DIALOG_DATA/MAT_BOTTOM_SHEET_DATA dans des tests jasmine sans spécifier de fournisseur. vous devez simplement vous assurer que la valeur en cours d'injection est non nulle. si elle est nulle, le compilateur confond la valeur null pour un fournisseur non existant et vous obtenez l'erreur fournisseur introuvable.

0
Bob