我正在为一个Angular 4组件编写一个测试,该组件是一个登录表单。可以通过单击“提交”按钮或在任何输入字段中按enter来提交表单。这种行为是由角度形式指令规定的。
我可以编写一个测试用例来验证单击按钮是否提交表单,但我不能用keypress事件触发提交行为。
<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();
});
});
});
});
从按钮分派'Click'事件的测试通过,但从输入元素分派keydown事件的测试(当前已禁用)失败。
我是否可以分派不同的事件来触发窗体的ngSubmit处理程序?
尝试使用keypress
而不是'keydown'
new KeyboardEvent('keypress', { key: 'Enter' })
问题内容: 如何仅在文本输入字段上使用Enter键提交表单,而不必添加提交按钮? 我记得以前曾经这样做过,但是现在我对其进行了测试,除非表单中有一个Submit-type输入字段,否则表单不会提交。 问题答案: $(“input”).keypress(function(event) { if (event.which == 13) { event.preventDefault(); $(“form
问题内容: 据我所知,在AngularJS中处理对话框中回车键的推荐方法是在对话框内放置一个 标记和一个提交按钮。 足够公平,但是如果您使用Angular-UI及其$ dialog服务,则在按Enter键时,该表单将仅以静默方式关闭。没有办法拦截。即使您将处理程序附加到ng-click或ng- submit,该窗体也将关闭而不返回任何结果。 还有什么我需要做的吗 [编辑] 解决后,我必须明确指定“
本文向大家介绍javascript实现回车键提交表单方法总结,包括了javascript实现回车键提交表单方法总结的使用技巧和注意事项,需要的朋友参考一下 本文实例总结了javascript实现回车键提交表单方法。分享给大家供大家参考。具体分析如下: 第一种方法:javascript实现 第二种方法:jquery实现(ie8、chrome和firefox都支持) 希望本文所述对大家基于js的web
本文向大家介绍jsp中如何实现按下回车键自动提交表单,包括了jsp中如何实现按下回车键自动提交表单的使用技巧和注意事项,需要的朋友参考一下 为了省事很多时候希望可以按回车键来提交表单,要控制这些行为,可以借助JS来达到要求。 代码如下: 解决方案: 把form表单放在一个div里面 ,然后对这个div监听事件$("#id").keydown(function (){}); #*#监听回车事件 #*
本文向大家介绍Jquery响应回车键直接提交表单操作代码,包括了Jquery响应回车键直接提交表单操作代码的使用技巧和注意事项,需要的朋友参考一下 事情是这样的,做了一个登陆页面,把 Form 去了,直接拿 Jquery 的 Ajax 跟服务器交互,但是这样的话 浏览器就不会默认响应 回车键提交数据了。索性让 Jquery 也接管 回车键的响应吧: 如果使用keydown的话,IE6可能无效,解决
我有一些角6形式,我集中在第一个可用的领域。它们包含一个提交按钮,当我按enter时,表单将自动提交,并触发ngSubmit事件。