我有一个用于 Angular Material MdDialog 的组件:
@Component({
...
})
export class MyComponent {
constructor(@Inject(MAT_DIALOG_DATA) public data: any, public dialogRef:
MdDialogRef<MyComponent>) {
...
}
}
我正在尝试用 Jasmine 对其进行单元测试:
describe('MyComponent', () => {
let component: MyComponent;
let fixture: ComponentFixture<MyComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
SharedTestingModule,
],
declarations: [
MyComponent,
],
})
.compileComponents();
}));
...
});
不幸的是,我收到以下错误:
错误:没有 InjectionToken MdDialogData 的提供程序!
SharedTestingModule 导入和导出我的自定义 Angular Material 模块,该模块本身导入和导出 MdDialogModule。
我怎样才能摆脱这个错误?
非常感谢!
Angular 4.2.4
Angular Material 2.0.0-beta.7
Jasmine 2.5.3
我添加了这个:
providers: [
{ provide: MAT_DIALOG_DATA, useValue: {} },
// { provide: MdDialogRef, useValue: {} }, --> deprecated
{ provide: MatDialogRef, useValue: {} } ---> now
]
它有效:)
感谢您的帮助@methgaard!
对于具有最新材质组件的 Angular 5
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
和
providers: [
{ provide: MAT_DIALOG_DATA, useValue: {} },
{ provide: MatDialogRef, useValue: {} }
]
试试这个
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
SharedTestingModule,
],
declarations: [
MyComponent,
],
providers: [ <-- here
{
provide: MdDialogData,
useValue: {},
}
] <-- to here
})
.compileComponents();
}));
让我知道进展如何
作为更新,这也适用于那些使用带有前缀“Mat”的标签的人
providers: [{provide: MAT_DIALOG_DATA, useValue: {}},
{provide: MatDialogRef, useValue: {}}]
你可以使用Angular可选装饰器,我之前也遇到过这个问题
如果该组件不用作弹出窗口尝试这个片段
constructor(
@Optional() public dialogRef: MatDialogRef<PopupComponent>,
@Optional() @Inject(MAT_DIALOG_DATA) public data: any
) {}
您可以在 jasmine 测试中注入 MAT_DIALOG_DATA / MAT_BOTTOM_SHEET_DATA 而不指定提供程序。您必须简单地确保注入的值不为空。如果为 null,则编译器会将 null 值误认为是不存在的提供程序,并且您会收到提供程序未找到错误。
尝试在
<x>.component.spec.ts
下添加您的 providers
:
{ provide: MatDialog, useValue: {} }
在某些情况下您还需要:
{ provide: MatDialogRef, useValue: {} }
(在我的 Angular 11 项目中以这种方式工作)
没有 InjectionToken MatDialogData 的提供者!,当我们运行测试用例时,当我们在相关组件中使用带有 @Inject(MAT_DIALOG_DATA) public value: string 的 matdialog 引用时,会发生此错误。
在spec.ts文件中添加以下代码
提供者:[MatDialogModule, { 提供:MAT_DIALOG_DATA,useValue:{} }, { 提供:MatDialogRef,useValue:{} }]
如果您像这样将dialogRef注入到组件的构造函数中,则上述解决方案将不起作用:
private biometricDialogRef: MatDialogRef<Component>,
删除它。