あなたがする必要があるのは、NgForm
のインジェクタを得ることです。それを理解するにはしばらく時間がかかりました。私はあなたがちょうどdebugElement
からそれを得ることができると思ったが、それはあなたの子供からそれを得る必要があるように見える。
let form: NgForm = fixture.debugElement.children[0].injector.get(NgForm);
ザ・あなただけの
let emailControl = form.control.get('email');
expect(emailControl.valid).toBe(true);
でフォームグループから個々のコントロールを得ることができますそれとも、単に特定のエラー以下
expect(form.control.hasError('emailInvalid', ['email'])).toBe(true);
ためのフォームを確認することができますすることは完全なテスト
です
import { Component, forwardRef, Directive } from '@angular/core';
import { TestBed, getTestBed, async } from '@angular/core/testing';
import { FormsModule, NG_VALIDATORS, Validator, AbstractControl, NgForm } from '@angular/forms';
import { dispatchEvent } from '@angular/platform-browser/testing/browser_util';
import { By } from '@angular/platform-browser';
@Directive({
selector: '[ngModel][validEmail]',
providers: [
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => EmailValidatorDirective),
multi: true
}
]
})
class EmailValidatorDirective implements Validator {
validate(c: AbstractControl): { [key: string]: any } {
if (c.value !== '[email protected]') {
return { notPeeskillet: true };
}
return null;
}
}
@Component({
template: `
<form>
<input name="email" [ngModel]="email" validEmail />
</form>
`
})
class TestComponent {
email;
}
describe('component: TestComponent',() => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [FormsModule],
declarations: [TestComponent, EmailValidatorDirective]
});
});
it('should validate', async(() => {
let fixture = TestBed.createComponent(TestComponent);
let comp = fixture.componentInstance;
let debug = fixture.debugElement;
let input = debug.query(By.css('[name=email]'));
fixture.detectChanges();
fixture.whenStable().then(() => {
input.nativeElement.value = '[email protected]';
dispatchEvent(input.nativeElement, 'input');
fixture.detectChanges();
let form: NgForm = debug.children[0].injector.get(NgForm);
let control = form.control.get('email');
expect(control.hasError('notPeeskillet')).toBe(true);
expect(form.control.valid).toEqual(false);
expect(form.control.hasError('notPeeskillet', ['email'])).toEqual(true);
input.nativeElement.value = '[email protected]';
dispatchEvent(input.nativeElement, 'input');
fixture.detectChanges();
expect(control.hasError('notPeeskillet')).toBe(false);
expect(form.control.valid).toEqual(true);
expect(form.control.hasError('notPeeskillet', ['email'])).toEqual(false);
});
}));
});
からFound it in the source code tests
'browser_util'インポートから{にdispatchEvent} '@角度/プラットフォームブラウザ/試験/ SRC/browser_util' 'に移動した;' – pgreen2
使用内蔵ディスパッチイベントではなく – Blacksonic