karma测试:TypeError:无法读取未定义的属性'地图'
问题描述:
我想用包含控件窗体函数的单独formControle文件依赖项来测试ReactiveFormsControle。我需要使用observable来传递窗体控件并返回错误信息。但是当我试图测试,我有这个错误:TypeError:无法读取属性'地图'undefinedkarma测试:TypeError:无法读取未定义的属性'地图'
任何人都可以帮助我请。
这是我的代码:
这是我怎么能叫的形式控制功能(进程信息):
ngAfterViewInit(): void {
// Watch for the blur event from any input element on the form.
let controlBlurs: Observable<any>[] = this.formInputElements
.map((formControl: ElementRef) => Observable.fromEvent(formControl.nativeElement, 'blur'));
// Merge the blur event observable with the valueChanges observable
Observable.merge(this.signUpForm.valueChanges, ...controlBlurs).debounceTime(1000).subscribe(value => {
this.displayeErrorMessage = this.formValidator.processMessages(this.signUpForm);
});
}
而processMessage功能:
processMessages(container : FormGroup) : {[key : string]: string}{
let messages = {};
for(let controlKey in container.controls){
if(container.controls.hasOwnProperty(controlKey)){
let c = container.controls[controlKey];
if(c instanceof FormGroup){
let childMessages = this.processMessages(c);
Object.assign(messages, childMessages);
}else {
if(this.validationErrorMessages[controlKey]){
messages[controlKey]='';
if((c.dirty || c.touched) && c.errors){
Object.keys(c.errors).map(messageKey =>{
if(this.validationErrorMessages[controlKey][messageKey]){
messages[controlKey] += this.validationErrorMessages[controlKey][messageKey] + ' '
}
})
}
}
}
}
}
return messages;
}
*此测试代码,处理错误*
beforeEach(() => {
fixture = TestBed.createComponent(SignUpComponent);
component = fixture.componentInstance;
debugHelpblck = fixture.debugElement.queryAll(By.css('.help-block'));
component.ngOnInit();
component.ngAfterViewInit(); // this handle the error
fixture.detectChanges();
});
答
map()
之前添加filter(Boolean)
,或更加小心你的数据(;
不知道从哪里出现的错误,如果是这样,那么所有的代码:
let controlBlurs: Observable<any>[] = this.formInputElements
.filter(Boolean)
.map(...)
或
Object.keys(c.errors).filter(Boolean).map(messageKey =>{...})
应该修复错误...
感谢您的回复,karma chow这个消息:'TypeError:无法读取未定义的属性'过滤器',我想问题是Observable没有被我的spec文件识别,但我不知道我该如何解决这个问题或者在spec中声明observable文件。 –
是'formInputElements'数组还是可观察的? – Sasxa
formInputElement是未定义的,这是它的声明:'@ViewChildren(FormControlName,{read:ElementRef})formInputElements:ElementRef [];' –