【问题标题】:Jest throwing TypeError : this.inputEl.focus is not a function #1964开玩笑抛出 TypeError : this.inputEl.focus 不是函数 #1964
【发布时间】:2019-10-21 05:53:18
【问题描述】:

模板版本:

 @stencil/core@1.7.0

笑话版:

   "jest": "24.8.0"

当前行为:

我正在尝试将输入元素集中在按钮单击上。 效果很好,但是在尝试使用 npm test 测试功能时,jest 会抛出 TypeErrorfocus 不是函数。

对于所有手动事件调用,例如 clickblurfocus,都会重复此错误。 因此测试用例没有通过。

预期行为:

它不应该抛出错误。

重现步骤: 我提供了一个相关的演示代码以供检查。 相关代码:

demo-btn.tsx
import { Component, h, Element } from '@stencil/core';

@Component({
  tag: 'demo-btn',
  styleUrl: 'demo-btn.css',
  shadow: true
})
export class DemoBtnComponent {
  @Element() el!: HTMLElement;
  private inputEl?: HTMLElement;

  onClick = () => {
    if (this.inputEl) {
      this.inputEl.focus();
    }
  }

  render() {
    return (
      <div class="input-container">
        <input ref={el => this.inputEl = el} type="text" />
        <button onClick={this.onClick}>
          Click Me
      </button>
      </div>
    );
  }
}
demo-btn.spec.tsx
import { newSpecPage } from '@stencil/core/testing';
import { DemoBtnComponent } from './demo-btn';

describe('my-component', () => {
  it('should focus input el on btn click', async ()=> {
    const page = await newSpecPage({
      components: [DemoBtnComponent],
      html: '<demo-btn></demo-btn>',
    });

    const btn = page.root.shadowRoot.querySelector('button')
    btn.click(); // Throws error after this line
    await page.waitForChanges();
    expect(true).toBeTruthy(); // For sake of completion
  });
});

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript jestjs stenciljs


    【解决方案1】:

    我通过模拟输入元素的focus 解决了这个问题。 下面是我试用的代码:

    import { newSpecPage } from '@stencil/core/testing';
    import { DemoBtnComponent } from './demo-btn';
    
    describe('my-component', () => {
      it('should focus input el on btn click', async ()=> {
        const page = await newSpecPage({
          components: [DemoBtnComponent],
          html: '<demo-btn></demo-btn>',
        });
    
        /** Mock Input Elements focus function */
        const inputEl = page.root.querySelector('input');
        inputEl.focus = jest.fn();
    
    
        const btn = page.root.querySelector('button')
        btn.click();
        await page.waitForChanges();
        expect(true).toBeTruthy();
      });
    });
    

    关闭这个问题。

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题,但是如果 focus() 函数在生命周期事件中,上述解决方案将不起作用。所以,为了解决这个问题,我在代码本身中使用了可选链接:

      this.inputEl?.focus?.();
      

      更多详情见本文:https://github.com/ionic-team/stencil/issues/1964

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-19
        • 2021-02-26
        • 2020-02-24
        • 1970-01-01
        • 1970-01-01
        • 2021-06-25
        • 1970-01-01
        相关资源
        最近更新 更多