我是 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 但我似乎无法很好地覆盖它
覆盖范围:
我试着嘲笑这个服务,但最终还是没有覆盖它。