jasmine: Is this the only difference between returnValue and callFake?

jasmine, javascript, mocking, unit-testing

Solution

callFake(() => {...}) takes a call back function

- If we just want a return value when a service method is called then we can use any of `and.callFake` or `and.returnValue`

component file:

@Component(...)
export class DependencyComponent {
  constructor(private service: RandomService){....}
  .....
  sampleMethod() {
   return this.service.randomMethod();
  }
  .....
}

unit test case for above component:

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)
})

in above case both the ways are correct.

- Suppose we are passing a parameter to service method to perform its logic then in that case we have to use `and.callFake((param) => {...})`. Here `param` parameter will be the argument passed to the spied method.

component file:

@Component(...)
export class DependencyComponent {
  constructor(private service: RandomService){....}
  .....
  sampleMethod(val) {
  return this.service.randomMethod(val);
  }
  .....
}

unit test case for above component:

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)
})

when `component.sampleMethod(4)` is executed it will call `this.service.randomMethod(4)`. As `randomMethod()` is being spied using `and.callFake` therefore `4` will be passed as argument of call back function of `and.callFake`.

Problem

The only difference between callFake and returnValue is that callFake can return different values on the basis of custom logic (parameters/environment)? Are there any other differences?

Original source