角单元测试:如何检查spied方法是否获取正确的参数?

时间:2019-07-05 19:04:51

标签: javascript angular typescript jasmine karma-jasmine

假设我们有一个名为Method1的方法,该方法接受和反对  obj={ name: 'jack', phone: '123' }

如您所见,这里有两个属性,名称和电话。

Method1在内部以obj.phone作为参数调用Method2。

FIDDLE

export class AppComponent {  
  method1(obj: any) {
    this.method2(obj.phone);
  }
  method2(val) {

  }
}

我想检查method2是否被调用,以及是否向其传递了正确的参数。在这种情况下,它将始终是obj的phone属性。

callFake()是解决方案吗?我该怎么办?

无效的代码:

it('should do something', () => {
    let obj = { name: 'jack', phone: '123' }
    let passedarg;
    let spy = spyOn(subject, 'method2').and.callFake(function (arg) {
      passedarg = arg;
    });
    expect(obj).toHaveBeenCalledWith(obj.phone);
  });

1 个答案:

答案 0 :(得分:1)

我不确定您当前正在测试什么。您是否检查method2是通过对象的phone属性作为method1的参数传递来调用的?

当前在测试中,您监视method2并提供模拟实现(callFake)。然后,您断言已使用其拥有的obj属性调用了JavaScript对象phone。您需要调用函数本身subject.method1(obj),然后才能查看是否调用了间谍程序。

如果这是您要实现的目标,我认为这可能是您想要的:

  it('should do something', () => {
    let obj = { name: 'jack', phone: '123' };
    spyOn(subject, 'method2');
    subject.method1(obj);
    expect(subject.method2).toHaveBeenCalledWith(obj.phone);
  });