【发布时间】:2017-05-11 15:05:24
【问题描述】:
我正在尝试使用 karma 为 Angular4 应用程序编写单元测试
在此之后我在TestBed.createComponent(ServicesComponent) 收到错误,所以没有一个测试用例被执行,并且
TypeError: this.expiry.last is not a function at Idle.Array.concat.Idle.watch...
在构造函数中写了很多东西(其中进行了服务调用并且还编写了空闲功能),应该如何编写测试用例?
这是我的规范文件,组件的构造函数中使用了空闲函数,我必须添加IdleExpiry、Keepalive 提供程序,以免出现Error: No provider for IdleExpiry 之类的异常
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
ServicesComponent
],
providers: [
{ provide: ServicesService, useClass: ServicesService },
{ provide: LocalStorageService, useClass: MockLocalStorageService },
{ provide: ServiceUtilities, useClass: ServiceUtilities },
{ provide: Idle, useClass: Idle },
{ provide: IdleExpiry, useClass: IdleExpiry },
{ provide: Keepalive, useClass: Keepalive },
{ provide: Router, useValue: routerStub },
{ provide: ActivatedRoute, useValue: activatedrouteStub },
MockBackend,
BaseRequestOptions,
{
provide: Http,
useFactory: (backend, options) => new Http(backend, options),
deps: [MockBackend, BaseRequestOptions]
}
],
imports: [
ModalModule.forRoot()
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ServicesComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
组件(不包括不必要的细节(替换为...))
export class ServicesComponent {
...
approxWaitingTime: string;
idleState = 'Not started.';
timedOut = false;
lastPing?: Date = null;
@ViewChild('autoShownModal') public autoShownModal: ModalDirective;
public isModalShown:boolean = false;
timer: any;
constructor(private servicesService: ServicesService, private route: ActivatedRoute, private router: Router, private idle: Idle, private keepalive: Keepalive) {
this.servicesService.getServices(this.centerId).subscribe(data => { ... });
this.servicesService.getCategories(this.centerId).subscribe(data => { ... });
this.servicesService.getStylists(this.centerId).subscribe(data => { ... });
this.servicesService.getApproxWaitingTime(this.centerId).subscribe(data => { ... });
this.route.queryParams.subscribe(params => { ... });
// sets an idle timeout of 120 seconds, for testing purposes.
idle.setIdle(10);
// sets a timeout period of 30 seconds. after 30 seconds of inactivity, the user will be considered timed out.
idle.setTimeout(5);
// sets the default interrupts, in this case, things like clicks, scrolls, touches to the document
idle.setInterrupts(DEFAULT_INTERRUPTSOURCES);
idle.onIdleEnd.subscribe(() => this.idleState = 'No longer idle.');
idle.onTimeout.subscribe(() => {
console.log("ontimeout");
this.idleState = 'Timed out!';
this.timedOut = true;
});
idle.onIdleStart.subscribe(() => this.idleState = 'You\'ve gone idle!');
idle.onTimeoutWarning.subscribe((countdown, router, autoShownModal) => {
console.log("time out" + countdown);
this.isModalShown = true;
this.timer = setTimeout(function () { if (this.isModalShown) { this.hideModal(); } this.reset(); this.router.navigate(['']); }.bind(this), 3000);
this.reset();
});
// sets the ping interval to 15 seconds
keepalive.interval(10);
keepalive.onPing.subscribe(() => { this.lastPing = new Date(); console.log('Keepalive.ping() called!'); });
this.reset();
}
...
我错过了什么吗?
【问题讨论】:
-
您介意将您的组件文件添加到问题中吗?
-
@AmitChigadani 我更新了问题
标签: angular unit-testing karma-jasmine