0

所以我遇到了这个问题,为 Angular 4 应用程序进行单元测试

发生的情况是它不断给出问题标题中所述的错误。

我尝试用谷歌搜索它,尝试导入一大堆不同的模块,最后发现这个“平台”的一个接近答案可能是来自@angular/browserPlatform.js 的 browserModule。

所以在我的单元测试中,我尝试导入它并声明它,但它没有帮助。

谁能帮忙解决这个问题,因为我什至不确定这个“平台”是什么?

问题:错误中的这个“平台”到底是什么以及如何解决?

谢谢。

我附上了我的代码如下:

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();
})

});

4

2 回答 2

5

我在使用 FocusMonitor 时遇到了类似的问题(在 Angular 5 中),并希望根据它来测试组件。FocusMonitor 又具有 Platform 的依赖关系。

在您的情况下,它与ScrollDispatcher具有相同的依赖关系。

您需要在 TestBed 的提供者中添加 Platform

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

...

providers: [
  {provide: OdmService, useValue: odmServiceSub}, 
  UserNotificationService, 
  MatSnackBar, 
  OVERLAY_PROVIDERS, 
  ScrollStrategyOptions,
  ScrollDispatcher,
  Platform
]
于 2018-01-31T22:40:34.027 回答
0

每当您收到“没有 XXX 提供程序”的消息时,通常意味着您providers在方法中的数组中缺少某些内容configureTestingModule。您是否尝试过添加PlatformRefproviders数组中?像这样:

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

但是,您缺少的一件事是detectChanges在您的 second 中调用beforeEach,它应该如下所示:

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

我要说的一件事是,在我的 Angular 4 应用程序中,大约有 800 个单元测试,其中没有一个使用或需要这个PlatformRef. 我认为问题在于这个“平台”的缺失detectChanges而不是任何事情。

于 2017-11-17T08:49:37.027 回答