无法在 Angular 2 单元测试 (Jasmine) 中模拟按键事件
Unable to simulate keypress event in Angular 2 unit test (Jasmine)
我正在使用指令从用作过滤文本的输入中获取数据。
这是指令中的主机监听器:
@HostListener('input', ['$event.target.value'])
public onChangeFilter(event: any): void {
console.log('input event fired, value: ' + event);
this.columnFiltering.filterString = event;
this.filterChanged.emit({filtering: this.columnFiltering});
}
此代码运行良好,我无法对其进行单元测试。
我已经订阅了 filterChanged EventEmitter,在我的单元测试中检查值。
我尝试模拟按键事件来更改值,还尝试设置值属性。 None 其中对我有用。
这是我的规范文件:
describe('Table View', () => {
let fixture: ComponentFixture<any>;
let context: TableComponent;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
TableComponent,
],
imports: [TableModule],
});
fixture = TestBed.createComponent(TableComponent);
context = fixture.componentInstance;
});
it('should allow filter', () => {
const element = fixture.nativeElement;
context.config = config;
fixture.detectChanges();
let tableChangeCount = 0;
let tableEvent: any;
context.tableChanged.subscribe((event: any) => {
tableChangeCount++;
tableEvent = event;
});
// Check if table exists
let inputElement = element.querySelectorAll('tr')[1].querySelector('input');
let e = new KeyboardEvent("keypress", {
key: "a",
bubbles: true,
cancelable: true,
});
inputElement.dispatchEvent(e);
});
});
我试过设置值:
let attrs = inputElement.attributes;
inputElement.setAttribute('value', 'abc');
for (let i = attrs.length - 1; i >= 0; i--) {
// Attribute value is set correctly
if (attrs[i].name === 'value') {
console.log(attrs[i].name + "->" + attrs[i].value);
}
}
任何人都可以帮助我,我怎样才能对它进行单元测试?
我在单元测试中模拟按键时也遇到了一些问题。但是遇到了 Seyed Jalal Hosseini 的回答。这可能就是您想要的。
如果您尝试模拟按键,您可以通过在元素上调用 dispatchEvent(new Event('keypress'));
来触发事件。
这是我所指的答案,其中提供了更多详细信息:
如果你想设置按下的键,也可以这样做。
const event = new KeyboardEvent("keypress",{
"key": "Enter"
});
el.dispatchEvent(event);
我刚刚得到的更多信息:https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events
如果您想使用键码(或"which"),您可以这样做:
// @HostListener('document:keypress')
const escapeEvent: any = document.createEvent('CustomEvent');
escapeEvent.which = 27;
escapeEvent.initEvent('keypress', true, true);
document.dispatchEvent(escapeEvent);
it('should trigger a TAB keypress event on an element', () => {
const tabKeypress = new KeyboardEvent('keypress', {
// @ts-ignore
keyCode: 9, // Tab Key
cancelable: true
});
const myTableEle = debugEle.nativeElement.querySelector('.your-element');
myTableEle.dispatchEvent(tabKeypress);
fixture.detectChanges();
});
// @ts-ignore :- 是为了删除 TS 警告,因为 keyCode 已被弃用。如果您想设置 KeyboardEvent 的“键”属性,则不需要它。
我正在使用指令从用作过滤文本的输入中获取数据。
这是指令中的主机监听器:
@HostListener('input', ['$event.target.value'])
public onChangeFilter(event: any): void {
console.log('input event fired, value: ' + event);
this.columnFiltering.filterString = event;
this.filterChanged.emit({filtering: this.columnFiltering});
}
此代码运行良好,我无法对其进行单元测试。
我已经订阅了 filterChanged EventEmitter,在我的单元测试中检查值。
我尝试模拟按键事件来更改值,还尝试设置值属性。 None 其中对我有用。
这是我的规范文件:
describe('Table View', () => {
let fixture: ComponentFixture<any>;
let context: TableComponent;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
TableComponent,
],
imports: [TableModule],
});
fixture = TestBed.createComponent(TableComponent);
context = fixture.componentInstance;
});
it('should allow filter', () => {
const element = fixture.nativeElement;
context.config = config;
fixture.detectChanges();
let tableChangeCount = 0;
let tableEvent: any;
context.tableChanged.subscribe((event: any) => {
tableChangeCount++;
tableEvent = event;
});
// Check if table exists
let inputElement = element.querySelectorAll('tr')[1].querySelector('input');
let e = new KeyboardEvent("keypress", {
key: "a",
bubbles: true,
cancelable: true,
});
inputElement.dispatchEvent(e);
});
});
我试过设置值:
let attrs = inputElement.attributes;
inputElement.setAttribute('value', 'abc');
for (let i = attrs.length - 1; i >= 0; i--) {
// Attribute value is set correctly
if (attrs[i].name === 'value') {
console.log(attrs[i].name + "->" + attrs[i].value);
}
}
任何人都可以帮助我,我怎样才能对它进行单元测试?
我在单元测试中模拟按键时也遇到了一些问题。但是遇到了 Seyed Jalal Hosseini 的回答。这可能就是您想要的。
如果您尝试模拟按键,您可以通过在元素上调用 dispatchEvent(new Event('keypress'));
来触发事件。
这是我所指的答案,其中提供了更多详细信息:
如果你想设置按下的键,也可以这样做。
const event = new KeyboardEvent("keypress",{
"key": "Enter"
});
el.dispatchEvent(event);
我刚刚得到的更多信息:https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events
如果您想使用键码(或"which"),您可以这样做:
// @HostListener('document:keypress')
const escapeEvent: any = document.createEvent('CustomEvent');
escapeEvent.which = 27;
escapeEvent.initEvent('keypress', true, true);
document.dispatchEvent(escapeEvent);
it('should trigger a TAB keypress event on an element', () => {
const tabKeypress = new KeyboardEvent('keypress', {
// @ts-ignore
keyCode: 9, // Tab Key
cancelable: true
});
const myTableEle = debugEle.nativeElement.querySelector('.your-element');
myTableEle.dispatchEvent(tabKeypress);
fixture.detectChanges();
});
// @ts-ignore :- 是为了删除 TS 警告,因为 keyCode 已被弃用。如果您想设置 KeyboardEvent 的“键”属性,则不需要它。