Angular 5-Jasimine测试-错误:NgModule的提供程序无效';动态测试模块';-仅允许提供程序和类型的实例
我试图测试一个组件类,但是,我的测试不起作用 这是堆栈错误的一部分:Angular 5-Jasimine测试-错误:NgModule的提供程序无效';动态测试模块';-仅允许提供程序和类型的实例,angular,unit-testing,typescript,jasmine,karma-jasmine,Angular,Unit Testing,Typescript,Jasmine,Karma Jasmine,我试图测试一个组件类,但是,我的测试不起作用 这是堆栈错误的一部分: 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://loca
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() {
...
}
}
从'@angular/core'导入{Component,OnInit,ViewChildren,QueryList,OnDestroy};
从'@angular/material'导入{MatMenuTrigger};
从'@angular/Router'导入{Router};
从“./../../../services/refresh on action.service”导入{RefreshOnActionService};
从“./../common/modal/alert modaldata.component”导入{AlertModaldataComponent};
从“/../../../shared/models/refresh entity enum”导入{RefreshEntityEnum};
从“/../../../services/refresh.service”导入{RefreshService};
从“../../../services/app.service”导入{AppService};
从“计时器”导入{setInterval,clearInterval};
从“../../../shared/models/status refresh enum”导入{StatusRefreshEnum};
@组成部分({
选择器:“应用程序标题”,
templateUrl:'./header.component.html',
样式URL:['./header.component.scss']
})
导出类HeaderComponent在nit、OnDestroy上实现{
loggedUserId;
showHeader=true;
isLoading:布尔值;
isAdmin=false;
menuItens:Array=[];
refreshId:编号;
气球=假;
balloitens=0;
第二个='00';
分钟='00';
小时='00';
timerZeroed=真;
更新列表=false;
getItemsQuantityInterval:任意;
专用定时器:any=null;
建造师(
专用appService:appService,
私人复习服务:复习服务,
专用模式:AlertModaldataComponent,
专用路由器:路由器,
私有refreshOnActionService:refreshOnActionService
) {
...
}
@ViewChildren(MatMenuTrigger)触发器:QueryList;
恩戈尼尼特(){
...
}
恩贡德斯特罗(){
...
}
refreshMenuItems():void{
...
}
RefreshBallodInfo(){
...
}
startTimer():void{
...
}
activateSetTimeIntervalForItemsQuantity(){
...
}
openMatMenu(){
...
}
关闭菜单(){
...
}
itemView(itemKey:any,类型:RefreshEntityEnum,状态:StatusRefreshEnum){
...
}
计时(时间戳:数字){
...
}
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();
});
});
从'@angular/core/testing'导入{ComponentFixture,TestBed};
从“@angular/platform browser/animations”导入{NoopAnimationsModule};
从'@angular/Router'导入{Router};
从“./../../../services/refresh on action.service”导入{RefreshOnActionService};
从“/../../../services/refresh.service”导入{RefreshService};
从“../../../common/common osg components.module”导入{CommonOsgComponentsModule};
从“../../../shared/testStubs/app stub.service”导入AppServiceStub;
从“../../shared/testStubs/refreshService存根”导入RefreshServiceStub;
从“../../../services/app.service”导入{AppService};
从“../../../shared/helpers”导入{setcstransformasvalidfarntombrowser};
从“./header.component”导入{HeaderComponent};
从“../../../AngularMaterial/AngularMaterial.module”导入{AngularMaterialModule};
从“../../../shared/testStubs/router stub”导入RouterStub;
从“../../../shared/models/refresh entity enum”导入{RefreshEntityEnum};
从“../../../shared/models/status refresh enum”导入{StatusRefreshEnum};
从“../../common/modal/alert modaldata.component”导入{AlertModaldataComponent};
fdescribe('HeaderComponent',()=>{
let组件:HeaderComponent;
let夹具:组件夹具;
在每个之前(()=>{
setcstransformasvalidforfandtombrowser();
TestBed.configureTestingModule({
进口:[
NoopAnimationsModule,
角度材料模块,
通用组件模块
],
声明:[
头部组件
],
供应商:[
AlertModaldataComponent,
{
提供:应用服务,
useClass:AppServiceStub
},
{
提供:路由器,
使用类别:RouterStub
},
{
供应商:刷新服务,
useClass:RefreshServiceStub
},
{
提供:RefreshOnActionService,
useClass:RefreshOnActionService
}
]
});
fixture=TestBed.createComponent(HeaderComponent);
组件=fixture.componentInstance;
fixture.detectChanges();
});
它('应该创建',()=>{
const-appService:appService=TestBed.get(appService);
appService[''u userData']='x195363';
expect(component.toBeTruthy();
});
});
每次我运行测试时,都会出现错误。总是同样的错误。
我试图在我的项目中找到DynamicTestModule,但它不存在,我不知道如何调试或解决此问题。有人可以帮我吗?在我的情况下,删除文件并重新创建具有相同内容的新文件后,一切正常。 我不知道发生了什么,但我想原始文件中的一些信息可能会被破坏。使用
provide: RefreshService,
useClass: RefreshServiceStub
而不是
provider: RefreshService,
useClass: RefreshServiceStub
我的一个组件也出现了同样的错误,该组件需要路由数据来初始化该组件。将
RouterTestingModule
添加到.spec文件中的configureTestingModule
后,错误消失
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ InitiativeComponent],
imports: [RouterTestingModule],
providers: [ RouterTestingModule],
})
.compileComponents();
}));
希望这对其他人有所帮助。这与您的问题无关,但您可以修改
tsconfig.json
文件,以便缩短导入时间。在映射到你的应用程序的compilerOptions.path
中添加选项,这样你就可以从'core'导入{Foo}等,而不是从'core'导入{Foo}。。