【发布时间】:2018-09-22 23:27:11
【问题描述】:
我正在尝试测试一个组件类,但是,我的测试不起作用。
这是堆栈错误的一部分:
Error: Invalid provider for the NgModule 'DynamicTestModule' - only instances of Provider and Type are allowed, got: [AlertModaldataComponent, [object Object], [object Object], ?[object Object]?, ...] in http://localhost:9878/_karma_webpack_/main.bundle.js (line 94300)
_reportError@http://localhost:9878/_karma_webpack_/main.bundle.js:94300:24
http://localhost:9878/_karma_webpack_/main.bundle.js:94095:39
forEach@[native code]
_getProvidersMetadata@http://localhost:9878/_karma_webpack_/main.bundle.js:94063:26
这是我的组件类
import { Component, OnInit, ViewChildren, QueryList, OnDestroy } from '@angular/core';
import { MatMenuTrigger } from '@angular/material';
import { Router } from '@angular/router';
import { RefreshOnActionService } from './../../../services/refresh-on-action.service';
import { AlertModaldataComponent } from './../../common/modal/alert-modaldata.component';
import { RefreshEntityEnum } from './../../../shared/models/refresh-entity-enum';
import { RefreshService } from './../../../services/refresh.service';
import { AppService } from '../../../services/app.service';
import { setInterval, clearInterval } from 'timers';
import { StatusRefreshEnum } from '../../../shared/models/status-refresh-enum';
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.scss']
})
export class HeaderComponent implements OnInit, OnDestroy {
loggedUserId;
showHeader = true;
isLoading: boolean;
isAdmin = false;
menuItens: Array<any> = [];
refreshId: number;
balloon = false;
balloonItens = 0;
second = '00';
minute = '00';
hour = '00';
timerZeroed = true;
updatingList = false;
getItemsQuantityInterval: any;
private timer: any = null;
constructor(
private appService: AppService,
private refreshService: RefreshService,
private modal: AlertModaldataComponent,
private router: Router,
private refreshOnActionService: RefreshOnActionService
) {
...
}
@ViewChildren(MatMenuTrigger) trigger: QueryList<MatMenuTrigger>;
ngOnInit() {
...
}
ngOnDestroy() {
...
}
refreshMenuItems(): void {
...
}
refreshBalloonInfo() {
...
}
startTimer(): void {
...
}
activateSetTimeIntervalForItemsQuantity() {
...
}
openMatMenu() {
...
}
closeMatMenu() {
...
}
itemView(itemKey: any, type: RefreshEntityEnum, status: StatusRefreshEnum) {
...
}
timing(timestamp: number) {
...
}
aprove() {
...
}
}
这是我的规范类...
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { Router } from '@angular/router';
import { RefreshOnActionService } from './../../../services/refresh-on-action.service';
import { RefreshService } from './../../../services/refresh.service';
import { CommonOsgComponentsModule } from './../../common/common-osg-components.module';
import AppServiceStub from '../../../shared/testStubs/app-stub.service';
import RefreshServiceStub from '../../../shared/testStubs/refreshService-stub';
import { AppService } from '../../../services/app.service';
import { setCssTransformAsValidForPhantomBrowser } from '../../../shared/helpers';
import { HeaderComponent } from './header.component';
import { AngularMaterialModule } from '../../../angular-material/angular-material.module';
import RouterStub from '../../../shared/testStubs/router-stub';
import { RefreshEntityEnum } from '../../../shared/models/refresh-entity-enum';
import { StatusRefreshEnum } from '../../../shared/models/status-refresh-enum';
import { AlertModaldataComponent } from '../../common/modal/alert-modaldata.component';
fdescribe('HeaderComponent', () => {
let component: HeaderComponent;
let fixture: ComponentFixture<HeaderComponent>;
beforeEach(() => {
setCssTransformAsValidForPhantomBrowser();
TestBed.configureTestingModule({
imports: [
NoopAnimationsModule,
AngularMaterialModule,
CommonOsgComponentsModule
],
declarations: [
HeaderComponent
],
providers: [
AlertModaldataComponent,
{
provide: AppService,
useClass: AppServiceStub
},
{
provide: Router,
useClass: RouterStub
},
{
provider: RefreshService,
useClass: RefreshServiceStub
},
{
provide: RefreshOnActionService,
useClass: RefreshOnActionService
}
]
});
fixture = TestBed.createComponent(HeaderComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
const appService: AppService = TestBed.get(AppService);
appService['_userData'] = 'x195363';
expect(component).toBeTruthy();
});
});
每次我运行测试时,都会发生错误。总是同样的错误。 我试图在我的项目中找到 DynamicTestModule 但它不存在,我不知道如何调试或解决这个问题。有人可以帮助我吗?
【问题讨论】:
-
这与您的问题无关,但您可以修改
tsconfig.json文件,以便缩短导入时间。在compilerOptions.paths中添加映射到您的应用程序的选项,以便您可以执行import { Foo } from 'core'等操作,而不是import { Foo } from '../../../../core' -
我想知道这是否与您在此测试中尝试练习的范围之外的测试有关。您正在提取整个 Material 进行测试。除非您正在测试渲染内容的输出,否则它似乎有点多。您能否删除 Material 并将
schemas: [NO_ERRORS_SCHEMA],放入您的测试平台配置中。这将有助于缩小错误的来源。它还可能允许您停止导入CommonOsgComponentsModule
标签: angular unit-testing typescript jasmine karma-jasmine