加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Angular 2自定义验证单元测试

发布时间:2020-12-17 06:48:50 所属栏目:安全 来源:网络整理
导读:我正在编写自定义角度(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: Ema
我正在编写自定义角度(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

现在我正在尝试将单元测试添加到我的自定义验证指令中.

beforeEach(() => {
      fixture = TestBed.createComponent(EmailComponent);
      component = fixture.componentInstance;
      de = fixture.debugElement;
      el = de.nativeElement;
      component = de.componentInstance;
      emailField = de.query(By.css('input')).nativeElement;
    });

我正在访问所有这些对象,但没有人知道我输入的有效性.有没有人知道如何在单元测试中访问我的输入的NgControl,或者我如何检查有效/无效(自定义验证)输入字段.

解决方法

你需要做的是获得具有NgForm的注射器.我花了一段时间才搞清楚.我以为你可以从debugElement中获取它,但看起来你需要从它的child1中获取它.

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 !== '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);
    });
  }));
});

1 – Found it in the source code tests

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读