gpt4 book ai didi

angular - 在 Angular 单元测试中使用回车键提交表单

转载 作者:太空狗 更新时间:2023-10-29 17:28:29 25 4
gpt4 key购买 nike

我正在为作为登录表单的 Angular 4 组件编写测试。可以通过单击“提交”按钮或在任何输入字段中按回车键来提交表单。此行为由 Angular 表单指令决定。

我可以编写一个测试用例来验证单击按钮是否提交了表单,但我无法通过按键事件触发提交行为。

模板:

<form (ngSubmit)="onLoginSubmit()" #loginForm="ngForm">
<div class="form-group">
<label for="userid">User ID</label>
<input type="text" class="form-control" name="userid" id="userid" required
[(ngModel)]="model.userId" #userid="ngModel">
<div [hidden]="userid.valid || userid.untouched" class="alert alert-danger">
User ID is required
</div>
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" name="password" id="password" required
[(ngModel)]="model.password" #password="ngModel">
<div [hidden]="password.valid || password.untouched" class="alert alert-danger">
Password is required
</div>
</div>
<button type="submit" class="btn btn-success" [disabled]="loginForm.form.invalid">Submit</button>

规范:

import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { DebugElement, Component, ViewChild } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { Observable } from 'rxjs/Observable';

import { LoginFormComponent } from './login-form.component';
import { ILoginService } from '../../service/ILoginService';
import { IAuthService } from '../../service/IAuthService';


describe('Login Form', () => {
let comp: LoginFormComponent;
let fixture: ComponentFixture<LoginFormComponent>;
let userIdElement: DebugElement;
let passwordElement: DebugElement;
let submitElement: DebugElement;

beforeEach(() => {
TestBed.configureTestingModule({
imports: [FormsModule, ReactiveFormsModule],
declarations: [LoginFormComponent],
providers: [
{ provide: 'IloginService', useClass: UserServiceMock },
{ provide: 'IAuthService', useClass: MockAuthService }]
});
fixture = TestBed.createComponent(LoginFormComponent);

comp = fixture.componentInstance;

userIdElement = fixture.debugElement.query(By.css('input[name=userid]'));
passwordElement = fixture.debugElement.query(By.css('input[name=password]'));
submitElement = fixture.debugElement.query(By.css('button'));
});

describe('Submit', () => {
let authService: IAuthService;
let authServiceSpy: jasmine.Spy;
let loginService: ILoginService;
let loginServiceSpy: jasmine.Spy;

beforeEach(() => {
comp.model.userId = 'mock user';
comp.model.password = 'mock password';
comp.loginUrl = 'mock url';

authService = fixture.debugElement.injector.get('IAuthService');
authServiceSpy = spyOn(authService, 'login').and.returnValue(null);

loginService = fixture.debugElement.injector.get('IloginService');
loginServiceSpy = spyOn(loginService, 'handleLoginResult');
});

it('should invoke the auth and login services when submit is clicked', () => {
submitElement.nativeElement.click();
});

xit('should submit the form on enter key pressed in userId input', () => {
userIdElement.nativeElement.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }))
});

xit('should submit the form on enter key pressed in password input', () => {
passwordElement.nativeElement.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }))
});

afterEach(() => {
fixture.detectChanges();
fixture.whenStable().then(() => {
expect(authService.login).toHaveBeenCalledWith('mock user', 'mock password', 'mock url');
expect(loginService.handleLoginResult).toHaveBeenCalled();
});
});
});
});

从按钮分派(dispatch)“点击”事件的测试通过,但从输入元素分派(dispatch) keydown 事件的测试(当前禁用)失败。

我可以分派(dispatch)其他事件来触发表单的 ngSubmit 处理程序吗?

最佳答案

尝试使用 keypress 而不是 'keydown`

new KeyboardEvent('keypress', { key: 'Enter' })

关于angular - 在 Angular 单元测试中使用回车键提交表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46289712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com