如何在Angular 9中使用dependecy对ASIN验证器进行单元测试
希望有人能帮我。我在Angular 9中创建了一个异步验证器如何在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
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
在这种情况下会返回一个可见值吗?