callFake和returnValue之间的唯一区别是callFake可以根据自定义逻辑(参数/环境)返回不同的值吗?
还有其他差异吗?
答案 0 :(得分:3)
callFake(()=> {...})具有回调函数
- 如果我们只想在调用服务方法时返回一个值,则可以使用
中的任何一个。and.callFake
或and.returnValue
组件文件:
@Component(...)
export class DependencyComponent {
constructor(private service: RandomService){....}
.....
sampleMethod() {
return this.service.randomMethod();
}
.....
}
上述组件的单元测试用例:
it('test callFake vs returnValue', () => {
let randomService= new RandomService();
let component = new DependencyComponent(randomService);
spyOn(randomService, 'randomMethod').and.callFake(() => 4)
expect(component.sampleMethod()).toBe(4)
spyOn(randomService, 'randomMethod').and.returnValue(10);
expect(component.sampleMethod()).toBe(10)
})
在上述情况下,两种方法都是正确的。
- 假设我们将参数传递给service方法以执行其逻辑,那么在这种情况下,我们必须使用
and.callFake((param) => {...})
。这里的param
参数是传递给间谍方法的参数。
组件文件:
@Component(...)
export class DependencyComponent {
constructor(private service: RandomService){....}
.....
sampleMethod(val) {
return this.service.randomMethod(val);
}
.....
}
上述组件的单元测试用例:
it('test callFake vs returnValue', () => {
let randomService= new RandomService();
let component = new DependencyComponent(randomService);
spyOn(randomService, 'randomMethod').and.callFake((param) => param+4)
expect(component.sampleMethod(4)).toBe(8);
expect(component.sampleMethod(12)).toBe(16)
})
在执行component.sampleMethod(4)
时,它将调用this.service.randomMethod(4)
。由于正在使用randomMethod()
监视and.callFake
,因此4
将作为and.callFake
的回调函数的参数传递。
答案 1 :(得分:0)
两者都是一样的.. returnValue只是callfake的语法糖就是我所理解的。
答案 2 :(得分:0)
当callfake将回调函数作为参数时,可以看到明显的区别或好处。
答案 3 :(得分:0)
我在Angular 8代码(使用茉莉花)中观察到returnValue
和callFake
之间有奇怪的行为和区别。下面是我的代码,
spyOn(object, 'method').and.returnValue(Promise.reject('error'));
当我有了上面的代码时,当我调用tick()
时,上面的spy方法将被单独调用-而不调用component方法。这导致我的测试失败,并显示错误Uncaught promise error
。但是,当我将上面的代码更改为此时,
spyOn(object, 'method').and.callFake(() => Promise.reject('error'));
代码按预期工作,只有在组件内部调用spy方法时才调用。
无法了解此处的区别以及callFake
起作用的原因。