Unit testing 无法模拟Angular 2单元测试中的按键事件(Jasmine)

Unit testing 无法模拟Angular 2单元测试中的按键事件(Jasmine),unit-testing,angular,input,jasmine,keypress,Unit Testing,Angular,Input,Jasmine,Keypress,我使用一个指令从用作过滤文本的输入中获取数据 以下是指令中的hostlistener: @HostListener('input', ['$event.target.value']) public onChangeFilter(event: any): void { console.log('input event fired, value: ' + event); this.columnFiltering.filterString = event; this.fil

我使用一个指令从用作过滤文本的输入中获取数据

以下是指令中的hostlistener:

@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,在我的单元测试中检查该值

我尝试模拟按键事件来更改值,还尝试设置值属性。这些都不适合我

这是我的规范文件:

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);
 });

});

有谁能帮助我,我怎样才能进行相同的单元测试?

我在单元测试中模拟按键时也遇到了一些问题。但是,塞义德·贾拉尔·侯赛尼给出了答案。这可能就是你想要的

如果您试图模拟按键,可以通过调用
dispatchEvent(新事件('keypress'))触发事件

以下是我所指的答案,其中给出了更多细节:

如果要设置按下的键,也可以这样做

const event = new KeyboardEvent("keypress",{
    "key": "Enter"
});
el.dispatchEvent(event);

我刚刚遇到的更多信息:

如果您希望使用密钥代码(或“which”),您可以执行以下操作:

// @HostListener('document:keypress')

const escapeEvent: any = document.createEvent('CustomEvent');
escapeEvent.which = 27;
escapeEvent.initEvent('keypress', true, true);
document.dispatchEvent(escapeEvent);

//@ts ignore:-将删除ts警告,因为keyCode已弃用。如果您想设置KeyboardEvent的“key”属性,则不需要它。

“这是我的规范文件:”。。。你能不能显示一个完整的测试,这样我们就可以试着找出你做错了什么。添加了完整的测试,有一个按钮点击排序和刷新,它工作正常。。m被困在这里您的期望在哪里?主机事件侦听器应该是Fire您是否尝试过调度输入事件而不是keypress?不支持KeyboardEvent构造函数IE@r0bb077,因为这只是出于测试目的,所以您可以将Karma配置为使用Chrome,我认为这是默认情况:毫无疑问,我想我应该为那些希望确保它能跨多个浏览器工作的人指出这一点,特别是那些仍然使用IE的平板电脑用户:)
// @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();
});