web-dev-qa-db-de.com

Angular Material und Jasmine: "Kein Anbieter für InjectionToken MdDialogData!"

Ich habe eine Komponente, die in einem Angular Material MdDialog verwendet werden soll:

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

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


}

Ich versuche es mit Jasmine zu testen:

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

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

  ...

});

Leider erhalte ich folgenden Fehler:

Fehler: Kein Provider für InjectionToken MdDialogData!

SharedTestingModule importiert und exportiert mein benutzerdefiniertes Angular Material-Modul, das selbst MdDialogModule importiert und exportiert.

Wie kann ich diesen Fehler beseitigen?

Vielen Dank!

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

Ich habe folgendes hinzugefügt:

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

Und es funktioniert :)

Danke für deine Hilfe @methgaard!

63
Wenneguen

Für Angular 5 mit der neuesten Materialkomponente

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

und

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

versuche dies

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

lass mich wissen wie es geht

9
methgaard

als Update wird dies auch für diejenigen repliziert, die die Tags mit dem Präfix "Mat" verwenden.

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

sie können MAT_DIALOG_DATA/MAT_BOTTOM_SHEET_DATA in Jasmin-Tests injizieren, ohne einen Anbieter anzugeben. Sie müssen lediglich sicherstellen, dass der injizierte Wert nicht null ist. Wenn es null ist, verwechselt der Compiler den Nullwert für einen nicht vorhandenen Anbieter, und Sie erhalten den Fehler, dass der Anbieter nicht gefunden wurde.

0
Bob