'Angular unit testing Type Error: Cannot read properties of undefined (reading 'get')
I am trying to mock the signup service, where the signup component consists of multiple form but getting the error as title(i.e. TypeError: Cannot read properties of undefined (reading 'get') at .ts file get userRegisterGroup()).How can I validate the controles of RegisterGroup** and codeVerifyGroup in .spec file
signup.spec
const routerSpy = jasmine.createSpyObj('Router', ['navigateByUrl']);
const signUpServiceSpy = jasmine.createSpyObj('signUpService', ['signUp']);
describe('SignIn Component Isolated Test', () => {
let component: SignupComponent;
let fixture: ComponentFixture<SignupComponent>;
beforeEach(() => {
component = new SignupComponent(new FormBuilder(), routerSpy, signUpServiceSpy);
});
it('Component successfully created', () => {
expect(component).toBeTruthy();
});
it('component initial state', () => {
expect(component.registerSubmitted).toBeFalsy();
expect(component.userRegisterGroup()).toBeDefined();
});
});
singup.ts
ngOnInit() {
this.registerForm = this.formBuilder.group({
userRegisterGroup: this.formBuilder.group({
name: ['', [
Validators.required,
Validators.minLength(3),
Validators.maxLength(20)
]],
email: ['', [Validators.required, Validators.email]],
password: ['', [Validators.required, Validators.minLength(8), Validators.maxLength(40)]],
}),
codeVerifyGroup: this.formBuilder.group({
code: ['', Validators.required]
})
});
}
get f() {
return (<FormGroup>this.registerForm.get('userRegisterGroup')).controls;
}
get c() {
return (<FormGroup>this.registerForm.get('codeVerifyGroup')).controls;
}
get userRegisterGroup() {
return this.registerForm.get('userRegisterGroup');
}
get codeVerifyGroup() {
return this.registerForm.get('codeVerifyGroup');
}
singup.html
<form [formGroup]="userRegisterGroup" (ngSubmit)="signUp()" *ngIf="!isConfirm">
<div class="form-group mb-3" id="username-container">
<label for="name" class="form-label required">Username</label>
<input type="name" id="name" formControlName="name" class="form-control"
placeholder="Enter Username"
[ngClass]="{ 'is-invalid': registerSubmitted && f.name.errors}"/>
<div id="username-error-msg" *ngIf="registerSubmitted && f.name.errors"
class="invalid-feedback" class="errorMsg">
<div id="blank-username-error" *ngIf="f.name.errors.required" class="errorMsg">
Please enter username.
</div>
<div id="blank-username-minlength-error" *ngIf="f.name.errors.minlength"
class="errorMsg">useranme sholud have minimum 3 characters.
</div>
<div id="blank-username-maxlength-error" *ngIf="f.name.errors.maxlength"
class="errorMsg">useranme sholud have minimum 40 characters.
</div>
</div>
</div>
<div class="form-group mb-3" id="email-container">
<label for="email" class="form-label required">Email</label>
<input type="email" id="email" formControlName="email" class="form-control "
placeholder="Enter user email address" [(ngModel)]="user.email"
[ngClass]="{ 'is-invalid': registerSubmitted && f.email.errors}"/>
<div id="email-error-msg" *ngIf="registerSubmitted && f.email.errors"
class="invalid-feedback" class="errorMsg">
<div id="blank-email-error" *ngIf="f.email.errors.required" class="errorMsg">Please
enter username.
</div>
<div id="blank-email-valid-error" *ngIf="f.email.errors.email" class="errorMsg">
Please enter a valid email address.
</div>
</div>
</div>
<div class="form-group mb-3" id="password-container">
<label for="password" class="form-label required">Password</label>
<input [type]="user.showPassword ? 'text' : 'password'" id="password"
formControlName="password" class="form-control " id="password" value="Default value"
placeholder="Enter Password"
[ngClass]="{ 'is-invalid': registerSubmitted && f.password.errors}"/>
<div id="password-error-msg" *ngIf="registerSubmitted && f.password.errors"
class="invalid-feedback" class="errorMsg">
<div id="blank-password-error" *ngIf="f.password.errors.required" class="errorMsg">
Please enter password.
</div>
<div id="blank-password-passworderror" *ngIf="f.password.errors.password"
class="errorMsg">Please enter valid password.
</div>
<div id="blank-password-minlength" *ngIf="f.password.errors.minlength"
class="errorMsg">Passwprd should have mimimum 0f 8 characters.
</div>
<div id="blank-password-maxlength" *ngIf="f.password.errors.minlength"
class="errorMsg">Passwprd should have maximum 0f 40 characters.
</div>
</div>
</div>
<div class="form-group" id="signup-btn-container">
<button type="submit" class="form-control login-btn mb-3" [disabled]="loading">
<span class="spinner-border spinner-border-sm" role="status"
aria-hidden="true"
*ngIf="loading"></span>
Registration
</button>
</div>
<div class="signup">Are you already a member? <a [routerLink]="['/login']"
class="text-primary">Login</a>
</div>
</form>
<!-- Code verfication -->
<form [formGroup]="codeVerifyGroup" (ngSubmit)="confirmSignUp()" *ngIf="isConfirm">
<div class="form-group" id="code-btn-container">
<label for="code" class="form-label required">Code</label>
<input type="text" id="code" formControlName="code"
class="form-control " [ngClass]="{ 'is-invalid': codeSubmitted && c.code.errors}"
placeholder="Enter the code..."/>
<div id="username-error-msg" *ngIf="codeSubmitted && c.code.errors"
class="invalid-feedback" class="errorMsg">
<div id="blank-code-error" *ngIf="c.code.errors.required" class="errorMsg">Please
enter code.
</div>
</div>
</div>
<div class="form-group" id="codeVerify-btn-container">
<button type="submit" class="form-control login-btn mb-3 mt-3" [disabled]="loading">
<span class="spinner-border spinner-border-sm" role="status"
aria-hidden="true"
*ngIf="loading"></span>
Confirm
</button>
</div>
</form>
How should I resolve it? Any code reference would help.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
