Angular Jasmine测试,未调用函数

Angular Jasmine测试,未调用函数,angular,typescript,jasmine,Angular,Typescript,Jasmine,我正在测试一个验证器,它调用一个服务,如果返回零,它将返回一个错误对象 我已经为该服务创建了一个带有returnValue的spy,它似乎工作得很好,但是我在执行验证函数和返回值时遇到了困难 我最终做的是为我正在测试的功能创建一个间谍,我认为我不应该这么做 验证程序功能: 它将服务作为参数并在内部使用 static require(service: Service): ValidatorFn { return (formGroup: FormGroup): { [key: string]:

我正在测试一个验证器,它调用一个服务,如果返回零,它将返回一个错误对象

我已经为该服务创建了一个带有returnValue的spy,它似乎工作得很好,但是我在执行验证函数和返回值时遇到了困难

我最终做的是为我正在测试的功能创建一个间谍,我认为我不应该这么做

验证程序功能:

它将服务作为参数并在内部使用

static require(service: Service): ValidatorFn {
   return (formGroup: FormGroup): { [key: string]: boolean } | null => {
      const checkedCount = state.currentCount();
      if (checkedCount === 0) {
          return  {
            'isNotChecked' : true
          };
        }
      return null;
    };
  }
这项测试有效: 正如我所说,我真的不认为我应该监视我正在测试的功能

  it('should return error object when currentCount === 0', () => {
        spyOn(service, 'currentCount').and.returnValue(0);
        spyOn(ModValidation, 'require').and.returnValue({ 'isNotChecked' : true });
        service.currenCount();
        expect(ModValidation.require(service)).toEqual({ 'isNotChecked' : true });
    });
我尝试过但不起作用的是:

  it('should return error object when currentCount === 0', () => {
        spyOn(service, 'currentCount').and.returnValue(0);
        const resp = ModValidation.require(service);
        service.currentCount();
        expect(resp).toEqual({ 'isNotChecked' : true });
    });
我明白了


问题是,验证器中的require方法是一个将抽象控件转换为验证结果的函数

所以你想说的是这样的:

it('currentCount 0', () => {
    const service = {currentCount: () => {}};
    spyOn(service, 'currentCount').and.returnValue(0);

    expect(CustomValidators.require(service)({} as any)).toEqual({
            'isNotChecked' : true
          });
  });

我做了一个Stackblitz供您检查:

只是为了进一步解释一下,这是有效的,因为您的验证独立于AbstractControl输入。例如,如果验证将使用输入控件来获取值,则需要传入模拟的抽象控件,而不是像任何{}那样传入。但无论如何,我很乐意帮忙:)谢谢你的解释
it('currentCount 0', () => {
    const service = {currentCount: () => {}};
    spyOn(service, 'currentCount').and.returnValue(0);

    expect(CustomValidators.require(service)({} as any)).toEqual({
            'isNotChecked' : true
          });
  });