在我的Angular 7组件中,ngOnInit
在服务上调用方法(getRecurrence
)。为了进行测试,我在模拟服务,但是模拟缺少该方法。 (因此,组件代码是正确的,但是测试模拟是错误的)
组件源代码段:
async ngOnInit() {
try {
var results = await Promise.all([
this.lookupService.getRecurrence(),
...
}
}
运行测试时,我在日志文件中收到预期的错误消息TypeError: this.lookupService.getRecurrence is not a function
,但是Jasmine和Karma报告测试已通过。
已编辑:茉莉花测试是从ng g c ...
创建的标准测试。
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyComponent],
imports: [ReactiveFormsModule, BrowserAnimationsModule, FormsModule],
providers: [
{ provide: LookupService, useClass: MockLookupService }
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
由于ngOnInit
是异步的,因此我尝试将async()
或fakeAsync()
添加到用于创建组件的beforeEach
和用于验证该组件的测试用例中,有用。
关于如何让Jasmine和Karma捕获错误并报告失败的任何建议?
编辑:我执行了Bill Cheng的建议,但还是没有运气。我在测试中添加了控制台日志消息(并将await Promise.all()
替换为await this.lookupService.getRecurrence()
),这就是我得到的。
ngOnInit源代码片段:
async ngOnInit() {
console.log('ngOnInit')
try {
console.log('Before getRecurrence')
this.recurrences = await this.lookupService.getRecurrence();
console.log('After getRecurrence')
...
}
}
测试代码:
it('should create', async() => {
fixture.detectChanges();
console.log('should create before whenStable')
await fixture.whenStable();
console.log('should create after whenStable')
expect(component).toBeTruthy();
});
控制台日志结果:
ngOnInit
context.js:245 Before getRecurrence
context.js:245 TypeError: this.lookupService.getRecurrence is not a function
[stack trace deleted]
context.js:245 should create before whenStable
context.js:245 should create after whenStable
在我看来,正在处理和食用TypeError的某个地方,所以就茉莉花而言,没有例外...
答案 0 :(得分:1)
答案正盯着我,我只需要发布更多代码。
async ngOnInit() {
try {
...
}
catch (err) {
console.log(err);
}
}
我正在处理错误,以便单元测试无法看到它。 /.\