【发布时间】:2019-05-07 20:46:39
【问题描述】:
我正在使用以下功能打开我的垫子对话框:
accept() {
let dialogRef = this.dialog.open(AcceptDialogComponent, {
data: {
hasAccepted: false
}
})
dialogRef.afterClosed().subscribe(result => {
console.log(result);
if (result.hasAccepted === true) {
this.leadService.acceptLead(this.holdingAccountId, this.lead.id)
.pipe(
takeUntil(this.onDestroy$)
)
.subscribe(acceptLeadRes => {
console.log(acceptLeadRes);
this.leadService.updateLeadAction('accept');
},
(err: HttpErrorResponse) => {
console.log(err);
this.router.navigate(['/error']);
});
}
});
}
我正在尝试为这个函数编写一个测试,它只是触发 afterClosed() 以便我可以检查是否调用了进行后端调用的服务方法。
component.spec.ts(在创建每个测试平台之前)
beforeEach(async (() => {
TestBed.configureTestingModule({
declarations: [LeadCardComponent, AcceptDialogComponent],
imports: [
requiredTestModules,
JwtModule.forRoot({
config: {
tokenGetter: () => {
return '';
}
}
})
],
providers: [
ApplicationInsightsService,
JwtHelperService,
// { provide: LeadsService, useValue: leadServiceSpy }
],
}),
TestBed.overrideModule(BrowserDynamicTestingModule, {
set: {
entryComponents: [AcceptDialogComponent]
}
});
TestBed.compileComponents();
}));
component.spec.ts(测试)
it('Return from AcceptLeadDialog with hasAccepted equals true should call acceptLead endpoint', () => {
let matDiaglogref = dialog.open(AcceptDialogComponent, {
data: {
hasAccepted: false
}
});
spyOn(matDiaglogref, 'afterClosed').and.callThrough().and.returnValue({
hasAccepted: true
});
spyOn(leadService, 'acceptLead').and.callThrough();
component.acceptLead();
fixture.detectChanges();
matDiaglogref.close();
fixture.detectChanges();
expect(leadService.acceptLead).toHaveBeenCalled();
});
测试当前失败,并显示“预期的间谍 acceptLead 已被调用”。我无法理解如何测试函数并执行某种模拟 MatDialogRef 以便我可以检查我的测试条件是否通过。
任何帮助/建议将不胜感激
更新从已接受答案实施的工作测试
it('Return from AcceptLeadDialog with hasAccepted equals true should call acceptLead endpoint', () => {
spyOn(component.dialog, 'open')
.and
.returnValue({
afterClosed: () => of({
hasAccepted: true
})
});
spyOn(leadService, 'acceptLead').and.callThrough();
component.acceptLead();
expect(component.dialog).toBeDefined();
expect(leadService.acceptLead).toHaveBeenCalled();
});
【问题讨论】:
-
你试过模拟
MatDialogopen方法吗?这样做应该允许您返回一个您可以控制的模拟MatDialogRef,并且您可以手动触发afterClosedobservable 以发出一个新值。 -
我可以手动触发 afterClosed 并仍然测试它的响应逻辑是执行附加代码的条件吗?
-
您的问题解决了吗?这是完整的解决方案,因为我还希望测试弹出窗口的打开和关闭
-
@dna 已经有一段时间了,但接受的答案对我的测试有效
-
是否有可能进行完整的测试
标签: angular unit-testing jasmine angular-material karma-jasmine