Monday, June 3, 2024
 Popular · Latest · Hot · Upcoming
130
rated 0 times [  134] [ 4]  / answers: 1 / hits: 44008  / 7 Years ago, thu, february 9, 2017, 12:00:00

I'm learning Angular 2 and unit testing using @angular/cli 1.0.0-beta.30 and had a bit of success testing one aspect of a form field's validity, but not all. I'm using an inline template in my component for the time being to remove a layer of complexity for now (a form template in a separate file introduces asynchronicity, correct?).



The ngOnInit() defines a name property that includes the validators for required and minLength. Currently an empty form field will correctly trigger the required validator but not the minLength validator. The name.errors array in the test does not contain any reference to required at all, name.errors['minLength'] returns undefined. Does minLength need to be handled asynchronously? I'm having trouble finding docs or examples that fit my problem.



// signup-form.component.ts
...
export class SignupFormComponent implements OnInit {

user: FormGroup;

constructor(private fb: FormBuilder) {
}

ngOnInit() {
this.user = this.fb.group({
name: ['', [Validators.required, Validators.minLength(2)]],
account: this.fb.group({
email: ['', Validators.required, Validators.pattern([^ @]*@[^ @]*)],
confirm: ['', Validators.required]
})
})
}

onSubmit({ value, valid }: { value: User, valid: boolean }) {
console.log(value, valid);
}

}


My test



// signup-form.component.spec.ts
import { SignupFormComponent } from './signup-form.component';

describe('SignupFormComponent', () => {
let component: SignupFormComponent;
let fixture: ComponentFixture<SignupFormComponent>;

beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [SignupFormComponent],
imports: [
ReactiveFormsModule,
FormsModule
]
})
.compileComponents();
}));

beforeEach(() => {
fixture = TestBed.createComponent(SignupFormComponent);
component = fixture.componentInstance;
component.ngOnInit();
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});

it('form invalid when empty', () => {
expect(component.user.valid).toBeFalsy();
});

it('name field validity', () => {
let name = component.user.controls['name'];
expect(name.valid).toBeFalsy();

let errors = {};
name.setValue();
errors = name.errors || {};
expect(errors['required']).toBeTruthy(); // this works
expect(errors['minLength']).toBeTruthy(); // this fails, undefined
});

});

More From » forms

 Answers
55

Answering your question




The name.errors['minLength'] returns undefined, Does minLength need to be
handled asynchronously?




You can just check the form for a specific error



expect(form.control.hasError('emailInvalid', ['email'])).toBe(true);


Below is a complete test



// signup-form.component.spec.ts
import { SignupFormComponent } from './signup-form.component';

describe('SignupFormComponent', () => {
let component: SignupFormComponent;
let fixture: ComponentFixture<SignupFormComponent>;

beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [SignupFormComponent],
imports: [
ReactiveFormsModule,
FormsModule
]
})
.compileComponents();
}));

beforeEach(() => {
fixture = TestBed.createComponent(SignupFormComponent);
component = fixture.componentInstance;
component.ngOnInit();
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});

it('form invalid when empty', () => {
expect(component.user.valid).toBeFalsy();
});

it('name field validity', () => {
let name = component.user.controls['name'];
expect(name.valid).toBeFalsy();

name.setValue();
expect(name.hasError('required')).toBeTruthy();

name.setValue(A);
expect(name.hasError('minLength')).toBeTruthy();
});

});

[#58999] Wednesday, February 8, 2017, 7 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
neilshamarh

Total Points: 181
Total Questions: 94
Total Answers: 104

Location: Guadeloupe
Member since Sat, Aug 22, 2020
4 Years ago
;