Kra*_*lov 5 typescript angular2-forms angular2-directives angular2-testing angular
我正在编写自定义角度(Angular 2.0.0)验证,遵循本指南https://angular.io/docs/ts/latest/cookbook/form-validation.html#!#custom-validation.
@Directive({
selector: '[ngModel][emailValidator]',
providers: [{provide: NG_VALIDATORS, useExisting: EmailValidatorDirective, multi: true}]
})
export class EmailValidatorDirective implements Validator
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试将单元测试添加到我的自定义验证指令中.
beforeEach(() => {
fixture = TestBed.createComponent(EmailComponent);
component = fixture.componentInstance;
de = fixture.debugElement;
el = de.nativeElement;
component = de.componentInstance;
emailField = de.query(By.css('input')).nativeElement;
});
Run Code Online (Sandbox Code Playgroud)
我正在访问所有这些对象,但没有人知道我输入的有效性.有没有人知道如何在单元测试中访问我的输入的NgControl,或者我如何检查有效/无效(自定义验证)输入字段.
Pau*_*tha 11
你需要做的是获得具有的注射器NgForm.我花了一段时间才搞清楚.我以为你可以从中得到它debugElement,但看起来你需要从它的孩子那里得到它1.
let form: NgForm = fixture.debugElement.children[0].injector.get(NgForm);
Run Code Online (Sandbox Code Playgroud)
您可以从表单组中获取单独的控件
let emailControl = form.control.get('email');
expect(emailControl.valid).toBe(true);
Run Code Online (Sandbox Code Playgroud)
或者您只需检查表单中是否存在特定错误
expect(form.control.hasError('emailInvalid', ['email'])).toBe(true);
Run Code Online (Sandbox Code Playgroud)
以下是完整的测试
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 !== 'peeskillet@stackoverflow.com') {
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 = 'bad@email.com';
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 = 'peeskillet@stackoverflow.com';
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);
});
}));
});
Run Code Online (Sandbox Code Playgroud)
1 - 在源代码测试中找到它
| 归档时间: |
|
| 查看次数: |
12391 次 |
| 最近记录: |