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 : {}}] });