如何在Angular 9中使用dependecy对ASIN验证器进行单元测试

如何在Angular 9中使用dependecy对ASIN验证器进行单元测试,angular,unit-testing,karma-jasmine,angular-reactive-forms,Angular,Unit Testing,Karma Jasmine,Angular Reactive Forms,希望有人能帮我。我在Angular 9中创建了一个异步验证器AsyncValidator fn,我想创建一个单元测试。请参阅下面的异步验证程序代码 export class ContactValidators { constructor(private contactService: ContactService) { } validContact(): AsyncValidatorFn { return ( control: AbstractContr

希望有人能帮我。我在Angular 9中创建了一个异步验证器
AsyncValidator fn
,我想创建一个单元测试。请参阅下面的异步验证程序代码

export class ContactValidators {
    constructor(private contactService: ContactService) { }

    validContact(): AsyncValidatorFn {
    return (
        control: AbstractControl
    ):
        | Promise<ValidationErrors | null>
        | Observable<ValidationErrors | null> => {
        if (control.value === '') {
            return of(null);
        } else {
            return control.valueChanges.pipe(
                debounceTime(800),
                take(1),
                concatMap(_ => this.contactService.isValidContact(control.value)
                    .pipe(
                        map(valid => {
                            if (!valid) {
                                return { invalid_contact: true };
                            }
                            return null;
                        })
                    ).pipe(first())
                )
            );
        }
    };
}
}
对于我的
spec
文件,这是我目前拥有的

describe('ContactValidators', () => {
  let contactValidators: ContactValidators;
    let contactServiceSpy: jasmine.SpyObj<ContactService>;

    beforeEach(() => {
        const spy = jasmine.createSpyObj('ContactService', ['getContact', 'isValidContact']);

        TestBed.configureTestingModule({
            imports: [ReactiveFormsModule,
                HttpClientTestingModule],
            providers: [
                ContactValidators,
                { provide: ContactService, useValue: spy }
            ]
        });

        contactServiceSpy = TestBed.inject(ContactService) as jasmine.SpyObj<ContactService>;
    });

    it('should be created', () => {
        contactValidators = new ContactValidators(peopleServiceSpy);
        expect(contactValidators).toBeTruthy();
    });

    it('should return `null` when contact name is valid', async(() => {
        contactValidators = new ContactValidators(contactServiceSpy);

        contactServiceSpy.isValidContact.and.returnValue(of(true));
        contactValidators.validContact('any_name_here')(formControl as AbstractControl);

        // expect something here
    }));
});
description('ContactValidators',()=>{
让contactValidators:contactValidators;
让我们联系服务间谍:jasmine.SpyObj;
在每个之前(()=>{
const spy=jasmine.createSpyObj('ContactService',['getContact','isValidContact']);
TestBed.configureTestingModule({
导入:[ReactiveFormsModule,
HttpClientTestingModule],
供应商:[
联系人验证器,
{提供:ContactService,useValue:spy}
]
});
contactServiceSpy=TestBed.inject(ContactService)为jasmine.SpyObj;
});
它('应该创建',()=>{
contactValidators=新的contactValidators(peopleServiceSpy);
expect(contactValidators.toBeTruthy();
});
它('当联系人名称有效时应返回'null',异步(()=>{
contactValidators=新的contactValidators(contactServiceSpy);
contactServiceSpy.isValidContact.and.returnValue(of(true));
contactValidators.validContact(“此处的任何名称”)(formControl作为AbstractControl);
//在这里期待一些东西
}));
});
但在运行此测试时,我发现
失败:无法读取未定义的
的属性“pipe”。我相信我的问题是,
ContactService
在调用我的方法
contactValidators.validContact
时没有得到解决

不确定如何在验证器中正确注入或模拟我的
ContactService

export class ContactValidators {
    constructor(private contactService: ContactService) { }

    validContact(): AsyncValidatorFn {
    return (
        control: AbstractControl
    ):
        | Promise<ValidationErrors | null>
        | Observable<ValidationErrors | null> => {
        if (control.value === '') {
            return of(null);
        } else {
            return control.valueChanges.pipe(
                debounceTime(800),
                take(1),
                concatMap(_ => this.contactService.isValidContact(control.value)
                    .pipe(
                        map(valid => {
                            if (!valid) {
                                return { invalid_contact: true };
                            }
                            return null;
                        })
                    ).pipe(first())
                )
            );
        }
    };
}
}

希望有人能在这里为我指引正确的方向,因为我现在已经跌跌撞撞了一天。

你确定
control.valueChanges
在这种情况下会返回一个可见值吗?