Tengo un DialogComponent que tiene el siguiente constructor donde Dialog es un objeto personalizado:
constructor( public dialogRef: MatDialogRef<CustomDialogComponent>, @Inject(MAT_DIALOG_DATA) public data: Dialog ) Creé el siguiente TestBed en Angular4:
data = new Dialog() data.message = 'Dialog Message' TestBed.configureTestingModule({ imports: [MaterialModules], declarations: [CustomDialogComponent], providers: [MatDialogRef, { provide: Dialog, useValue: data }] }) TestBed.overrideModule(BrowserDynamicTestingModule, { set: { entryComponents: [CustomDialogComponent] } }) await TestBed.compileComponents()Pero me sale el siguiente error:
Failed: Can't resolve all parameters for MatDialogRef: (?, ?, ?). Error: Can't resolve all parameters for MatDialogRef: (?, ?, ?).cambiar de proveedor a:
providers: [ { provide: MatDialogRef, useValue: {} }, { provide: MAT_DIALOG_DATA, useValue: data } ]da como resultado el siguiente error:
Error: No provider for Dialog!¿Cómo resuelvo esto?
Lo resolví cambiando el constructor del componente a:
constructor( public dialogRef: MatDialogRef<CustomDialogComponent>, @Inject(MAT_DIALOG_DATA) public data: Dialog | any )Los proveedores en TestBed fueron:
providers: [{ provide: MatDialogRef, useValue: {} }, { provide: MAT_DIALOG_DATA, useValue: data }]Si usa al menos un método MatDialogRef , debe crear un simulacro. Por ejemplo, uso el método close() . Sin él, se generarían errores, así que hice la siguiente clase con un método vacío.
export class MatDialogRefMock { close(value = '') { } } y use eso en lugar de un valor vacío, con useClass
{ provide: MatDialogRef, useClass: MatDialogRefMock },Importe MatDialogModule y MatDialogRef desde angular/material/dialog en lugar de angular/material. Importe ModalDialogModule y proporcione proveedores para MatDialogRef en su TestBed.
Import {MatdialogModule,MatDialogRef} from '@angular/material/dialog'; TestBed.configureTestingModule({ declarations: [componentName], imports: [MatdialogModule], providers: [{provide : MatDialogRef, useValue : {}}] });