如何在 Angular 测试中覆盖 service.map?

问题描述 投票:0回答:0

我是 Angular UT 的新手。

我发现很难在我当前的测试中覆盖 this.service.map。这是我要测试的方法:

validateSupervisorLevel(eid = '', supervisorLevel: number): AsyncValidatorFn {
    return (
      control: AbstractControl
    ):
      | Promise<ValidationErrors | null>
      | Observable<ValidationErrors | null> => {
      if (isEmptyInputValue(control.value)) {
        return of(null);
      } else if (control.value === eid) {
        return this.mrdrService.getUserDetails(control.value).pipe(
          debounceTime(800),
          // eslint-disable-next-line @typescript-eslint/no-explicit-any
          map((adUserDetails: MrdrDetails) => {
            const careerLevel = adUserDetails?.displayableCareerLevel;
            if (
              Number(careerLevel) <= supervisorLevel ||
              careerLevel === 'Accenture Leadership'
            ) {
              return null;
            }

            if (adUserDetails) {
              return { invalid_supervisor_level: true };
            } else {
              return { invalid_supervisor: true };
            }
          }),
          first()
        );
      } else {
        return control.valueChanges.pipe(
          debounceTime(800),
          take(1),
          concatMap((_) =>
            this.mrdrService.getUserDetails(control.value).pipe(
              debounceTime(800),
              // eslint-disable-next-line @typescript-eslint/no-explicit-any
              map((adUserDetails: MrdrDetails) => {
                const careerLevel = adUserDetails?.displayableCareerLevel;
                if (
                  Number(careerLevel) <= supervisorLevel ||
                  careerLevel === 'Accenture Leadership'
                ) {
                  return null;
                }
                if (adUserDetails) {
                  return { invalid_supervisor_level: true };
                } else {
                  return { invalid_supervisor: true };
                }
              }),
              first(),
              catchError(() => {
                return of({ contactservicedown: true });
              })
            )
          )
        );
      }
    };
  }

这就是我到目前为止所做的:

//start of validateSupervisorLevel
  it('should return null if control value is empty in validatesuperiorlevel',()=>{
    let mrdrService = TestBed.inject(IpdomainMrdrService);
    const mockMrdrDetails : MrdrDetails = {
      enterpriseId: 'earvin.nill.castillo',
      supervisorName: 'Earvin Castillo',
      displayableCareerLevel: '9'

    }
    let eid ='earvin.nill.castillo';
    let supervisorLevel=9;
    const controlValue : any = new FormControl();
    controlValue.setValue(null)

    const valid = validator.validateSupervisorLevel(eid,supervisorLevel)
    
    const result = valid(controlValue)
    expect(result).toBeDefined();
  
  })

   it('should return else if control value is empty in validatesuperiorlevel',()=>{
    let mrdrService = TestBed.inject(IpdomainMrdrService);
    const mockMrdrDetails : MrdrDetails = {
      enterpriseId: 'earvin.nill.castillo',
      supervisorName: 'Earvin Castillo',
      displayableCareerLevel: '9'

    }
    let eid ='earvin.nill.castillo';
    let supervisorLevel=9;
    const controlValue : any = new FormControl();
    controlValue.setValue('earvin.nill.castillo')

    const valid = validator.validateSupervisorLevel(eid,supervisorLevel)
    
    const result = valid(controlValue)
    getuserdet.MrdrDetails = mockMrdrDetails
    getuserdet.MrdrDetails.displayableCareerLevel = mockMrdrDetails.displayableCareerLevel
    expect(result).toBeDefined();
  
  })

问题是我已经尝试了其他解决方法来覆盖 this.service 和 .map 但我似乎无法很好地覆盖它

覆盖范围:

Coverage

我试着嘲笑这个服务,但最终还是没有覆盖它。

reactjs angular unit-testing testing jasmine
© www.soinside.com 2019 - 2024. All rights reserved.