茉莉:这是returnValue和callFake之间的唯一区别吗?

时间:2017-05-08 03:08:42

标签: javascript unit-testing jasmine mocking

callFake和returnValue之间的唯一区别是callFake可以根据自定义逻辑(参数/环境)返回不同的值吗?

还有其他差异吗?

4 个答案:

答案 0 :(得分:3)

callFake(()=> {...})具有回调函数

  
      
  1. 如果我们只想在调用服务方法时返回一个值,则可以使用and.callFakeand.returnValue
  2. 中的任何一个。   

组件文件:

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

在上述情况下,两种方法都是正确的。

  
      
  1. 假设我们将参数传递给service方法以执行其逻辑,那么在这种情况下,我们必须使用and.callFake((param) => {...})。这里的param参数是传递给间谍方法的参数。
  2.   

组件文件:

@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代码(使用茉莉花)中观察到returnValuecallFake之间有奇怪的行为和区别。下面是我的代码,

spyOn(object, 'method').and.returnValue(Promise.reject('error'));

当我有了上面的代码时,当我调用tick()时,上面的spy方法将被单独调用-而不调用component方法。这导致我的测试失败,并显示错误Uncaught promise error。但是,当我将上面的代码更改为此时,

spyOn(object, 'method').and.callFake(() => Promise.reject('error'));

代码按预期工作,只有在组件内部调用spy方法时才调用。

无法了解此处的区别以及callFake起作用的原因。