单元测试有问题 angular 从按钮点击重置响应式表单控件
Trouble unit testing angular reactive form control reset from button click
我在为我的 angular 应用程序编写 jasmine 单元测试用例时遇到问题。
有一个反应形式,并试图通过单击按钮重置特定的表单控件。
尽管场景应该足够简单以供测试,但我似乎在这里遗漏了一些东西。
下面是应用程序的代码片段。
app.component.html:
<form [formGroup]="userForm" novalidate (ngSubmit)="onSubmit()">
<div>
<input
type="text"
id="fNameFld"
name="fName"
formControlName="fName"
placeholder="First Name"
/>
<button (click)="clearField('fName')" id="clrFName">
Clear First Name
</button>
</div>
<div>
<input
type="text"
id="lNameFld"
name="lName"
formControlName="lName"
placeholder="Last Name"
/>
<button (click)="clearField('lName')" id="clrLName">Clear Last Name</button>
</div>
<div>
<button type="submit">Submit</button>
</div>
</form>
app.component.ts
import { FormBuilder, FormGroup } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements OnInit {
name = 'Angular ' + VERSION.major;
userForm: FormGroup;
constructor(private readonly fb: FormBuilder) {}
ngOnInit() {
this.userForm = this.fb.group({
fName: this.fb.control(null),
lName: this.fb.control(null),
});
}
onSubmit() {
console.log('Submitted Data', this.userForm.value);
}
clearField(controlName: string) {
this.userForm.get(controlName).reset();
}
}
单元测试代码
it('should clear fName control when the "Clear First Name" button is clicked', () => {
const spy = spyOn(component, 'clearField');
const clearBtn = fixture.debugElement.query(By.css("button#clrFName"));
const form = component.userForm;
form.patchValue({
'fName': 'John,
'lName': 'Doe'
});
clearBtn.nativeElement.click();
fixture.detectChanges();
expect(spy).toHaveBeenCalledTimes(1); // passes
expect(spy).toHaveBeenCalledWith('fName'); // passes
expect(form.get('fName').value).toBeNull(); // fails: Expected 'John' to be null.
});
Angular: 10.0.14
Angular CLI:10.0.8
StackBlitz:https://angular-ivy-fc6rik.stackblitz.io
你好像在嘲笑 clearField
。添加此内容以在您模拟它时实际执行其内容:
const spy = spyOn(component, 'clearField').and.callThrough();
所以每次 clearField
被调用时,它都会触发间谍(所以你知道它是否被调用),并会执行它的内容。
我在为我的 angular 应用程序编写 jasmine 单元测试用例时遇到问题。 有一个反应形式,并试图通过单击按钮重置特定的表单控件。 尽管场景应该足够简单以供测试,但我似乎在这里遗漏了一些东西。
下面是应用程序的代码片段。
app.component.html:
<form [formGroup]="userForm" novalidate (ngSubmit)="onSubmit()">
<div>
<input
type="text"
id="fNameFld"
name="fName"
formControlName="fName"
placeholder="First Name"
/>
<button (click)="clearField('fName')" id="clrFName">
Clear First Name
</button>
</div>
<div>
<input
type="text"
id="lNameFld"
name="lName"
formControlName="lName"
placeholder="Last Name"
/>
<button (click)="clearField('lName')" id="clrLName">Clear Last Name</button>
</div>
<div>
<button type="submit">Submit</button>
</div>
</form>
app.component.ts
import { FormBuilder, FormGroup } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements OnInit {
name = 'Angular ' + VERSION.major;
userForm: FormGroup;
constructor(private readonly fb: FormBuilder) {}
ngOnInit() {
this.userForm = this.fb.group({
fName: this.fb.control(null),
lName: this.fb.control(null),
});
}
onSubmit() {
console.log('Submitted Data', this.userForm.value);
}
clearField(controlName: string) {
this.userForm.get(controlName).reset();
}
}
单元测试代码
it('should clear fName control when the "Clear First Name" button is clicked', () => {
const spy = spyOn(component, 'clearField');
const clearBtn = fixture.debugElement.query(By.css("button#clrFName"));
const form = component.userForm;
form.patchValue({
'fName': 'John,
'lName': 'Doe'
});
clearBtn.nativeElement.click();
fixture.detectChanges();
expect(spy).toHaveBeenCalledTimes(1); // passes
expect(spy).toHaveBeenCalledWith('fName'); // passes
expect(form.get('fName').value).toBeNull(); // fails: Expected 'John' to be null.
});
Angular: 10.0.14
Angular CLI:10.0.8
StackBlitz:https://angular-ivy-fc6rik.stackblitz.io
你好像在嘲笑 clearField
。添加此内容以在您模拟它时实际执行其内容:
const spy = spyOn(component, 'clearField').and.callThrough();
所以每次 clearField
被调用时,它都会触发间谍(所以你知道它是否被调用),并会执行它的内容。