Угловой материал и жасмин: "Нет провайдера для InjectionToken MdDialogData!"

У меня есть компонент, который предназначен для использования в угловом материале MdDialog:

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

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


}

Я пытаюсь Unit Test it with 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

Ответы

Ответ 1

Я добавил:

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

И это работает :)

Спасибо за вашу помощь @methgaard!

Ответ 2

Для угловых 5 с последним компонентом материала

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

а также

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

Ответ 3

как обновление, это также реплицируется для тех, кто использует теги с префиксом "Мат",

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

Ответ 4

попробуй это

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

дайте мне знать, как это происходит

Ответ 5

Вы можете ввести MAT_DIALOG_DATA/MAT_BOTTOM_SHEET_DATA в тестах жасмина без указания поставщика. Вы должны просто убедиться, что вводимое значение не является нулевым. если это значение равно null, компилятор ошибочно принимает значение NULL для несуществующего поставщика, и вы получаете ошибку поставщика не найдена.