【问题标题】:Svelte Jest test case making document.getElementId as nullSvelte Jest 测试用例使 document.getElementbyId 为 null
【发布时间】:2025-12-13 06:00:02
【问题描述】:

我正在尝试使用 jest-transform-svelte 库为我的 svelte 组件编写单元测试用例。以下是组件:

XYZ.svelte

<script>
  function submit() {
    var name = document.getElementById("name").value; // Here document.getElementById("name") is coming as null when run from unit test case.
    dispatch("abc", {
      text: name
    });
  }
</script>
<input id="name" value="" type="text" label="Name" />
<button label="Submit" variant="primary" on:click={submit} />

XYZ.test.js

import XYZ from "XYZ.svelte";

describe("XYZ Component", () => {
  it('dispatches abc event on submit', (next) => {

    const target = document.createElement('div');
    const xyz = new XYZ({ target: target });

    setTimeout(() => {
      const button = target.querySelector("button");
      button.click();

      xyz.$on('abc', event => {
        next();
      });
    }, 10);
  });
});

当 button.click 测试用例发生时,调用触发了 XYZ.svelte 中的提交函数,但是,

document.getElementById("name")

以 null 的形式出现,因为出现空指针异常错误。

知道我做错了什么吗?

【问题讨论】:

    标签: javascript jestjs svelte svelte-3


    【解决方案1】:

    在 Svelte 中,您可以通过将元素的引用绑定到变量来避开 document.getElementById。尝试按如下方式更改您的组件:

    <script>
      import { createEventDispatcher } from 'svelte';
    
      const dispatch = createEventDispatcher();
      let name = null;
    
      function submit () {
        dispatch("abc", {
          text: name
        });
      }
    </script>
    <input bind:value={name} type="text" label="Name" />
    <button label="Submit" variant="primary" on:click={submit} />
    

    【讨论】:

    • 感谢您提供答案。但是有什么办法可以在这里使用 document.getElementById 吗?为什么它不工作?有什么想法吗?
    • 您可以使用 document.getElementById,因为 Svelte 只生成常规 DOM 节点。您需要注意的是何时您正在调用它。确保节点已写入 DOM 很重要。您可以在尝试之前执行一些检查,但最好的方法是不要使用它 - 这与任何动态的、添加了 javascript 的 DOM 元素相同。如果当你尝试选择它时,该节点在 DOM 中不存在,则选择将失败。