javascript - 在测试(Lit)Web 组件之前如何等待异步连接回调完成?

标签 javascript jestjs web-component chai lit

我正在使用Lit Framework现在,但我认为常规 Web 组件也会发生这种情况。

我的connectedCallback异步,但是,使用Lit fixture,我认为它不会等到connectedCallback code> 已完成,因此我的状态更改发生在测试完成后。

作为解决方法,我在 connectedCallback 末尾放置了 this.dispatchEvent(new Event('cc-completed')

@customElement('my-lit-element')
export default class MyLitElement extends LitElement {
  override async connectedCallback() {
    super.connectedCallback();
    await this.loadStuff(); // Also changes state
    this.dispatchEvent(new Event('cc-completed'));
  }
}

然后:

it('My Lit Element Test #1', async () => {
  const myLitElement: MyLitElement = await fixture(html`
    <my-lit-element .prop=${"prop"}></my-lit-element>
  `);

  myLitElement.addEventListener('cc-completed', () => {
    // asserts
  });
}).timeout(5000);

但是,这仅适用于调试和断点,因为否则测试将完成并且回调将被挂起。

这样做的正确方法是什么?

最佳答案

对于同步更新请求(例如设置响应式属性),执行 await myLitElement.updateComplete 就足够了。

但是,如果导致 connectedCallback 内更新的事情是异步的,那么唯一的方法就是轮询您正在寻找的某些结果。

Open-WC 在 @open-wc/testing 包中提供了一些用于此目的的测试实用程序。 waitUntil允许您提供通用谓词函数和一些选项,例如间隔和超时。 oneEvent让您等待事件的触发,就像您在第二个示例中触发的事件一样。

在您的测试中,一个可能的解决方案是,您还可以将超时作为 waitUntiloptions 参数传递:

it('My Lit Element Test #1', async () => {
  const myLitElement: MyLitElement = await fixture(html`
    <my-lit-element .prop=${"prop"}></my-lit-element>
  `);

  await waitUntil(
    () => myLitElement.shadowRoot!.querySelector('#id'),
    'Element is not ready', { timeout: 5000 }
  );

  // asserts
})

关于javascript - 在测试(Lit)Web 组件之前如何等待异步连接回调完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75608529/

相关文章:

javascript - 正确更新状态数组中给定索引处的项目

javascript - 在 Javascript 中测量字符串宽度

javascript - 突出显示 html 表格中具有选定值的行

javascript - InnerHTML 换行符带有非常长的换行符字符串,来自 MYSQL 查询

typescript - 在 typescript 中 Jest mock express 和 Mongoose

javascript - Polymer WebComponents 数据绑定(bind) js 对象/数组

javascript - 使用 babel 转译基于类的 Web 组件

javascript - Safari 上可定制的内置元素——通过脚本标签与 ES6 导入进行 polyfill

javascript - 属性的单元测试失败,只能在单个节点上运行?

javascript - 在 react-testing-library 中运行单元测试时出现意外标识符