Angular 2 - Reactive表单上的密码验证

时间:2018-06-08 22:10:44

标签: ionic3 karma-jasmine angular2-forms

我正在构建一个应该验证新密码和重复新密码的表单。但是,我在他们的测试中遇到了错误,我无法弄清楚如何解决它们。

首先,我有一种方法来启动所需的表格:

private initForm(): any {
  this.form = this.fb.group({
     oldPassword': ["", Validators.compose([Validators.required, Validators.minLength(6)])]
  })

  let newPassword = new FormControl(null, [
    Validators.required,
    Validators.minLength(6),
    this.validNewPassword(this.form)
  ])

  let repeatNewPassword = new FormControl(null, [
    Validators.required, 
    Validators.minLength(6),
    this.validPasswordConfirm(this.form)
  ]);

  this.form.addControl('newPassword', newPassword);
  this.form.addControl('repeatNewPassword', repeatNewPassword);
}

在这里,我声明了两个应该处理其值的方法:

private validNewPassword(form: any): any {
  return ((control: FormControl) => {
    let newPassword = control.value;
    if (newPassword == form.value.oldPassword && newPassword !== form.value.repeatNewPassword) {
      return {
        newPassword: true
      }
    }
  return null;
  })   
}

private validPasswordConfirm(form: any): any {
  return ((control: FormControl) => {
    let repeatPassword = control.value;
    if (repeatPassword == form.value.oldPassword && repeatPassword !== form.value.newPassword) {
      return {
        repeatPassword: true
      }
    }
  return null;
  })   
}

新密码和重复新密码都应该相同,并且仍然与当前密码不同有效。但是当我运行测试时,我会得到以下结果:

it('should test new password validation', () => {
    let errors = {};
    let oldPassword = comp.form.controls['oldPassword'];
    let newPassword = comp.form.controls['newPassword'];
    let repeatNewPassword = comp.form.controls['repeatNewPassword']; 
    errors = newPassword.errors || {};

    expect(newPassword.valid).toBeFalsy();

    expect(errors['required']).toBeTruthy(); 

    newPassword.setValue('12345');
    errors = newPassword.errors || {};    
    expect(errors['minlength']).toBeDefined();

    // old is equal new
    oldPassword.setValue('123456')
    newPassword.setValue('123456');
    repeatNewPassword.setValue('123455');
    errors = repeatNewPassword.errors || {};    
    expect(errors['newPassword']).toBeTruthy(); // >> Expected undefined to be truthy

    // all equal
    oldPassword.setValue('123456');
    newPassword.setValue('123456');
    repeatNewPassword.setValue('123456'); 
    errors = newPassword.errors || {};    
    expect(errors['newPassword']).toBeTruthy();

    // all different
    oldPassword.setValue('123123');
    newPassword.setValue('123455');
    repeatNewPassword.setValue('123456'); 
    errors = newPassword.errors || {};
    expect(errors['newPassword']).toBeTruthy(); // >> Expected undefined to be truthy

    // valid
    oldPassword.setValue('123456');
    newPassword.setValue('654321');
    repeatNewPassword.setValue('654321');   
    expect(newPassword.valid).toBeTruthy();
  }); 


it('should test repeat password validation', () => {
    let errors = {};
    let oldPassword = comp.form.controls['oldPassword'];
    let newPassword = comp.form.controls['newPassword'];
    let repeatNewPassword = comp.form.controls['repeatNewPassword']; 
    errors = repeatNewPassword.errors || {};

    expect(newPassword.valid).toBeFalsy();

    expect(errors['required']).toBeTruthy(); 

    repeatNewPassword.setValue('12345');
    errors = repeatNewPassword.errors || {};    
    expect(errors['minlength']).toBeDefined();

    // old is equal repeat
    oldPassword.setValue('123456')
    newPassword.setValue('123455');
    repeatNewPassword.setValue('123456');
    errors = repeatNewPassword.errors || {};    
    expect(errors['repeatPassword']).toBeTruthy();

    // all different
    oldPassword.setValue('123454')
    newPassword.setValue('123455');
    repeatNewPassword.setValue('123456');
    errors = repeatNewPassword.errors || {};    
    expect(errors['repeatPassword']).toBeTruthy(); // >> Expected undefined to be truthy

    // all equal
    oldPassword.setValue('123456');
    newPassword.setValue('123456');
    repeatNewPassword.setValue('123456');
    errors = repeatNewPassword.errors || {};    
    expect(errors['repeatPassword']).toBeTruthy(); // >> Expected undefined to be truthy

    // valid
    oldPassword.setValue('123455');
    newPassword.setValue('123456');
    repeatNewPassword.setValue('123456');    
    expect(repeatNewPassword.valid).toBeTruthy(); 
  });

如果有人可以帮助我,我将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

这就是我解决它的方法:

1)按预期启动表单,但现在我验证整个表单

  private initForm(): any {
    this.form = new FormGroup({
      'oldPassword': new FormControl(null, [Validators.required, Validators.minLength(6)]),
      'newPassword': new FormControl(null, [Validators.required, Validators.minLength(6)]),
      'repeatNewPassword': new FormControl(null, [Validators.required, Validators.minLength(6)])
    }, this.validatePassword);
  }

  private validatePassword(fg: FormGroup) {
    return fg.get('newPassword').value === fg.get('repeatNewPassword').value && 
      fg.get('newPassword').value !== fg.get('oldPassword').value && 
      fg.get('repeatNewPassword').value !== fg.get('oldPassword').value 
      ? null : { 'invalidPassword': true };
  }

2)HTML验证

<ion-input class="password-field" id="oldPassword" [type]="type" formControlName="oldPassword"
  [class.invalid]="!form.valid && (form.get(['oldPassword']).dirty || submitAttempt)">
</ion-input>

3)测试验证

  it('should test new password validation', () => {
    let errors = {};
    let oldPassword = comp.form.controls['oldPassword'];
    let newPassword = comp.form.controls['newPassword'];
    let repeatNewPassword = comp.form.controls['repeatNewPassword']; 
    errors = comp.form.errors || {};

    expect(comp.form.valid).toBeFalsy();

    newPassword.setValue('12345');
    errors = newPassword.errors || {};    
    expect(errors['minlength']).toBeDefined();

    // old is equal new
    oldPassword.setValue('123456')
    newPassword.setValue('123456');
    repeatNewPassword.setValue('123455');
    errors = comp.form.errors || {};    
    expect(errors['invalidPassword']).toBeTruthy();

    // all equal
    oldPassword.setValue('123456');
    newPassword.setValue('123456');
    repeatNewPassword.setValue('123456'); 
    errors = comp.form.errors || {};    
    expect(errors['invalidPassword']).toBeTruthy();

    // all different
    oldPassword.setValue('123123');
    newPassword.setValue('123455');
    repeatNewPassword.setValue('123456'); 
    errors = comp.form.errors || {};    
    expect(errors['invalidPassword']).toBeTruthy();

    // valid
    oldPassword.setValue('123456');
    newPassword.setValue('654321');
    repeatNewPassword.setValue('654321');   
    expect(newPassword.valid).toBeTruthy();
  });