> ## Documentation Index
> Fetch the complete documentation index at: https://bun.zhcndoc.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 bun test 导入、require 和测试 Svelte 组件

Bun 的 [插件 API](/runtime/plugins) 允许你向项目添加自定义加载器。`bunfig.toml` 中的 `test.preload` 选项让你配置加载器在测试运行前启动。

首先，安装 `@testing-library/svelte`、`svelte` 和 `@happy-dom/global-registrator`。

```bash terminal icon="terminal" theme={"theme":{"light":"github-light","dark":"dracula"}}
bun add @testing-library/svelte svelte@4 @happy-dom/global-registrator
```

然后，将以下插件保存到你的项目中。

```ts svelte-loader.ts icon="https://mintcdn.com/bun-zhcndoc/cnUTwgMuf4cCrwC-/icons/typescript.svg?fit=max&auto=format&n=cnUTwgMuf4cCrwC-&q=85&s=e7767043c9e885c34f2d6c8fe2a95217" theme={"theme":{"light":"github-light","dark":"dracula"}}
import { plugin } from "bun";
import { compile } from "svelte/compiler";
import { readFileSync } from "fs";
import { beforeEach, afterEach } from "bun:test";
import { GlobalRegistrator } from "@happy-dom/global-registrator";

beforeEach(async () => {
  await GlobalRegistrator.register();
});

afterEach(async () => {
  await GlobalRegistrator.unregister();
});

plugin({
  title: "svelte loader",
  setup(builder) {
    builder.onLoad({ filter: /\.svelte(\?[^.]+)?$/ }, ({ path }) => {
      try {
        const source = readFileSync(path.substring(0, path.includes("?") ? path.indexOf("?") : path.length), "utf-8");

        const result = compile(source, {
          filetitle: path,
          generate: "client",
          dev: false,
        });

        return {
          contents: result.js.code,
          loader: "js",
        };
      } catch (err) {
        throw new Error(`编译 Svelte 组件失败：${err.message}`);
      }
    });
  },
});
```

***

在 `bunfig.toml` 中添加以下内容，告诉 Bun 预加载此插件，这样它会在测试运行前加载。

```toml bunfig.toml icon="settings" theme={"theme":{"light":"github-light","dark":"dracula"}}
[test]
# 告诉 Bun 在测试运行前加载此插件
preload = ["./svelte-loader.ts"]

# 也可以写成：
# test.preload = ["./svelte-loader.ts"]
```

***

在项目中添加一个示例 `.svelte` 文件。

```html Counter.svelte icon="file-code" theme={"theme":{"light":"github-light","dark":"dracula"}}
<script>
  export let initialCount = 0;
  let count = initialCount;
</script>

<button on:click="{() => (count += 1)}">+1</button>
```

***

现在你可以在测试中通过 `import` 或 `require` 引入 `*.svelte` 文件，它会将 Svelte 组件作为 JavaScript 模块加载。

```ts hello-svelte.test.ts icon="https://mintcdn.com/bun-zhcndoc/cnUTwgMuf4cCrwC-/icons/typescript.svg?fit=max&auto=format&n=cnUTwgMuf4cCrwC-&q=85&s=e7767043c9e885c34f2d6c8fe2a95217" theme={"theme":{"light":"github-light","dark":"dracula"}}
import { test, expect } from "bun:test";
import { render, fireEvent } from "@testing-library/svelte";
import Counter from "./Counter.svelte";

test("点击时计数器递增", async () => {
  const { getByText, component } = render(Counter);
  const button = getByText("+1");

  // 初始状态
  expect(component.$$.ctx[0]).toBe(0); // initialCount 是第一个属性

  // 点击递增按钮
  await fireEvent.click(button);

  // 检查新的状态
  expect(component.$$.ctx[0]).toBe(1);
});
```

***

使用 `bun test` 来运行测试。

```bash terminal icon="terminal" theme={"theme":{"light":"github-light","dark":"dracula"}}
bun test
```
