我有一个要进行单元测试的函数,我不知道该如何处理。
someFunction(): boolean {
this.service.login().subscribe(response => {
if (response) {
return someOtherFunction();
}
});
}
someOtherFunction(): boolean {
this.service.otherTask().subscribe(response => {
if (response) {
return true;
}
});
}
我想测试的结果是 someFunction
在这种情况下。然而,这并不奏效。
describe('someFunction', () => {
it('returns true', () => {
serviceSpy.login.and.returnValue(of({response: response}));
serviceSpy.otherTask.and.returnValue(of({response: otherResponse}));
result = component.someFunction();
expect(result).toEqual(true);
});
});
ServiceSpy在这块之前就已经被配置好了. 我可以看到函数被执行并且返回true. 然而,此刻我要求的是 result
但它仍然是未定义的。测试框架没有等待所有的事情完成。我试过使用async、fakeAsync、done(),但这些都没有用。someFunction
?
问题是在函数内部,它们在函数的内部返回结果。subscribe
那是行不通的,你需要返回一个观测值或者使用一个局部变量。
someFunction(): Observable<boolean> {
return this.service.login().pipe(
first(),
switchMap(res => res ? this.someOtherFunction() : of(undefined)),
);
}
someOtherFunction(): Observable<boolean> {
return this.service.otherTask().pipe(
first(),
map(response => !!response),
);
}
然后在你的测试中,你可以做
describe('someFunction', (done) => {
it('returns true', () => {
serviceSpy.login.and.returnValue(of({response: response}));
serviceSpy.otherTask.and.returnValue(of({response: otherResponse}));
component.someFunction().subscribe(result => {
expect(result).toEqual(true);
done();
});
});
});
从@satanTime的回答和评论中得到启发,再加上在网上搜索了一下,我编辑了我的代码,测试如下。someOtherFunction
似乎没有任何问题的订阅,所以我在简化中省略了它。
someFunction(): Observable<boolean> {
return this.service.login().pipe(map(response => {
if (response) {
return someOtherFunction();
}
}));
}
someOtherFunction(): boolean {
return true;
}
测试。
describe('someFunction', () => {
it('returns true', (done) => {
serviceSpy.login.and.returnValue(of({response: response}));
serviceSpy.otherTask.and.returnValue(of({response: otherResponse}));
component.someFunction().subscribe(result => {
expect(result).toEqual(true);
done();
});
});
});