body {overflow:auto;}
这是场景。
要测试的东西:
MethodToBeTested() {
this.serviceA.methodA1().subscribe((response) => {
if (response.Success) {
this.serviceA.methodA2().subscribe((res) => {
this.serviceB.methodB1();
})
}
});
}
被呼叫。serviceA.methodA1().
serviceA.methodA2()
收到值时是否调用了serviceB.methodB1()
。首先,一个易于测试。
serviceA.methodA2()
但是一个测试2和3吗?
let spy = spyOn(serviceA, 'methodA1');
expect(spy).toHaveBeenCalled();
类似的东西?
答案 0 :(得分:1)
最好不要使用嵌套订阅。
类似这样的解决方案:
let $obs1 = this.serviceA.methodA1().pipe(share());
let $obs2 = $obs1.pipe(switchMap(x => this.serviceA.methodA2()));
$obs1.subsribe(logic1 here...);
$obs2.subsribe(logic2 here...);
答案 1 :(得分:0)
好吧,所以我知道我要寻找的是callFake
it('should test inside of subscribe', () => {
let spy = spyOn(serviceA, 'methodA1').and.callFake(() => {
return of({ success: true });
});
let spy2 = spyOn(serviceA, 'methodA2').and.callFake(() => {
return of({ success: true });
});
let spy3 = spyOn(serviceB, 'methodB1').and.returnValue(of({ success: true }));
subject.MethodToBeTested();
expect(spy3).toHaveBeenCalled();
});
我了解到returnValue
实际上不会在预订内部执行,而callFake
将会使用您在其中提供的数据。