Нет провайдера для платформы

Итак, я столкнулся с этой проблемой, создав модульный тест для приложения Angular 4.

Что происходит, так это то, что он продолжает выдавать ошибку, указанную здесь, в заголовке вопроса.

Я попытался погуглить, попытался импортировать целую кучу разных модулей и, наконец, обнаружил, что близким ответом на то, что представляет собой эта «Платформа», может быть browserModule из @angular/browser Platform.

Итак, в моем модульном тестировании я попытался импортировать и объявить его, но это не помогло.

Может ли кто-нибудь помочь с этим, поскольку я даже не уверен, что это за «Платформа»?

Вопрос: что именно за "Платформа" в ошибке и как это исправить?

Спасибо.

Я прикрепил свой код, как показано ниже:

import { ComponentFixture, TestBed, async} from "@angular/core/testing";
import { DebugElement, CUSTOM_ELEMENTS_SCHEMA, PlatformRef} from 
"@angular/core";
import { TeamCreationAssignmentComponent } from "./team-creation-assignment.component";
import { OdmService } from "../../services/odm/odm.service";
import { UserNotificationService } from "../../services/user/user-notification.service";
import { MatSnackBar } from "@angular/material";
import { OVERLAY_PROVIDERS, ScrollStrategyOptions, ScrollDispatcher} from "@angular/cdk/overlay";

describe('Team creation assignment component', () => {
let comp: TeamCreationAssignmentComponent;
let fixture: ComponentFixture<TeamCreationAssignmentComponent>;

let odmServiceSub = {};


beforeEach(async(() => {
    TestBed.configureTestingModule({

        declarations: [TeamCreationAssignmentComponent],
        //imports: [BrowserModule],
        schemas: [CUSTOM_ELEMENTS_SCHEMA],
        providers: [
            {provide: OdmService, useValue: odmServiceSub}, 
            UserNotificationService, 
            MatSnackBar, 
            OVERLAY_PROVIDERS, 
            ScrollStrategyOptions,
            ScrollDispatcher,
        ],
    })
    .compileComponents();
}));

beforeEach(() => {
    fixture = TestBed.createComponent(TeamCreationAssignmentComponent);
    comp = fixture.componentInstance;
});

it('should have defined component', () => {
    expect(comp).toBeDefined();
})

});


person red_Coder    schedule 17.11.2017    source источник
comment
вставьте сюда свой тестовый файл.   -  person sabithpocker    schedule 17.11.2017
comment
Что такое платформа, уже есть ответы здесь, и в поиске Google есть другие результаты.   -  person sabithpocker    schedule 17.11.2017
comment
Большое спасибо за разъяснение, что такое Платформа. Но, как я уже сказал, я попробовал браузерный модуль в своем тестовом коде, но ничего не сработало.   -  person red_Coder    schedule 17.11.2017
comment
Если вы используете @angular-cli, сгенерируйте компонент, используя его ng g c dummy, затем проверьте сгенерированный файл спецификации и сравните его со своим.   -  person sabithpocker    schedule 17.11.2017
comment
@sabithpocker Я сравнил фиктивную тестовую спецификацию со своей, буквально нет большой разницы, за исключением того, что в моем файле спецификаций у меня намного больше поставщиков. Но я должен объявить провайдеров, иначе он выдаст мне кучу ошибок. Я устранил множество других ошибок отсутствия провайдера для XXX, прежде чем я пришел сюда к этому Нет провайдера для платформы.   -  person red_Coder    schedule 17.11.2017


Ответы (2)


Я столкнулся с похожей проблемой (в Angular 5), используя FocusMonitor и желая протестировать компонент в зависимости от него. FocusMonitor, в свою очередь, зависит от платформы.

В вашем случае это та же зависимость с ScrollDispatcher.

Вам нужно будет добавить платформу в поставщики вашего TestBed.

import { Platform } from '@angular/cdk/platform';

...

providers: [
  {provide: OdmService, useValue: odmServiceSub}, 
  UserNotificationService, 
  MatSnackBar, 
  OVERLAY_PROVIDERS, 
  ScrollStrategyOptions,
  ScrollDispatcher,
  Platform
]
person zbateson    schedule 31.01.2018
comment
К сожалению, я больше не участвовал в этом проекте. Позвольте мне передать его моему товарищу по команде и посмотреть, работает ли это. Спасибо за Ваш ответ. - person red_Coder; 05.03.2018
comment
Подтвердил, что это работает. Должен быть принятый ответ. - person yoonjesung; 04.05.2018

Всякий раз, когда вы получаете сообщение о том, что «Нет провайдера для XXX», это обычно означает, что вам не хватает чего-то из массива providers в методе configureTestingModule. Вы пытались добавить PlatformRef в массив providers? Как это:

providers: [
    {provide: OdmService, useValue: odmServiceSub}, 
    UserNotificationService, 
    MatSnackBar, 
    OVERLAY_PROVIDERS, 
    ScrollStrategyOptions,
    ScrollDispatcher,
    PlatformRef // <- added here
],

Однако одна вещь, которую вам не хватает, это вызов detectChanges во втором beforeEach, он должен выглядеть так:

beforeEach(() => {
    fixture = TestBed.createComponent(TeamCreationAssignmentComponent);
    comp = fixture.componentInstance;
    fixture.detectChanges(); // <- this is required
});

Скажу одно: в моем приложении Angular 4 около 800 модульных тестов, и ни один из них не использует и не требует этого PlatformRef. Я думаю, что проблема в недостающем detectChanges, а не в чем-то, что связано с этой «платформой».

person danwellman    schedule 17.11.2017
comment
Одна вещь, которую я забыл упомянуть, это то, что я использовал угловой материал во всем приложении, не знаю, может ли это быть причиной. Но я попробую ваше предложение, как только у меня будет шанс, и дам вам знать. Спасибо - person red_Coder; 17.11.2017