> For AI agents: the complete documentation index is available at /zh/llms.txt, the full documentation bundle is available at /zh/llms-full.txt.

# 测试 \{#testing}

Rstack CLI 使用 [Rstest](https://rstest.rs/zh/) 运行测试。

```bash
rs test
```

命令行选项和子命令请参阅 [`rs test`](/zh/guide/cli/test.md)。

## 配置测试 \{#configure-tests}

通过 [`define.test()`](/zh/guide/configuration.md#define-test) 注册 Rstest 配置，其用法与将配置传给 Rstest 的 `defineConfig()` 一致：

```ts title="rstack.config.ts"
import { define } from 'rstack';

define.test({
  testEnvironment: 'node',
});
```

## 测试 API \{#test-apis}

测试 API 和配置辅助函数可从 [`rstack/test`](/zh/guide/api-reference.md#rstacktest) 导入：

```ts
import { defineInlineProject, expect, test } from 'rstack/test';
```

## 配置继承 \{#configuration-inheritance}

当 `define.test()` 未设置 Rstest 的 [`extends`](https://rstest.rs/zh/config/test/extends) 时，Rstack CLI 会自动将 `define.app()` 或 `define.lib()` 注册的配置转换为 Rstest 配置，再与直接传给 `define.test()` 的选项合并。

### 继承应用配置 \{#inherit-the-application-configuration}

注册 `define.app()` 后，Rstack CLI 会通过 [`@rstest/adapter-rsbuild`](https://rstest.rs/zh/guide/integration/rsbuild) 转换该配置，并将结果作为测试配置的 `extends`：

```ts title="rstack.config.ts"
import { define } from 'rstack';

define.app({
  resolve: {
    alias: {
      '@': './src',
    },
  },
});

define.test({
  // 继承 `define.app()` 中的 `resolve.alias`
  testEnvironment: 'happy-dom',
});
```

### 继承库配置 \{#inherit-the-library-configuration}

注册 `define.lib()` 后，Rstack CLI 会通过 [`@rstest/adapter-rslib`](https://rstest.rs/zh/guide/integration/rslib) 转换该配置：

```ts title="rstack.config.ts"
import { define } from 'rstack';

define.lib({
  resolve: {
    alias: {
      '@': './src',
    },
  },
});

define.test({
  // 继承 `define.lib()` 中的 `resolve.alias`
  testEnvironment: 'node',
});
```

:::tip

同时注册两种配置时，Rstack CLI 会优先使用 `define.app()`。

:::

### 关闭自动继承 \{#disable-automatic-inheritance}

如果测试配置需要保持独立，请显式设置 `extends`。将它设置为空对象可以关闭自动继承，且不会继承其他配置：

```ts title="rstack.config.ts"
import { define } from 'rstack';

define.app({
  resolve: {
    alias: {
      '@': './src',
    },
  },
});

define.test({
  extends: {},
  testEnvironment: 'node',
});
```

使用多项目配置时，在 `define.test()` 根配置中设置 `extends` 会关闭所有项目的自动继承；在某个内联项目中设置 `extends` 则只会关闭该项目的自动继承。

## 多项目 \{#multiple-projects}

通过 Rstest 的 [`projects`](https://rstest.rs/zh/config/test/projects) 选项可以同时运行多套测试配置。每一项既可以是内联项目，也可以是由 Rstest 解析为外部项目的字符串。

### 内联项目 \{#inline-projects}

不同测试环境需要共享当前应用或库配置时，请使用内联项目：

```ts title="rstack.config.ts"
import { define } from 'rstack';
import { defineInlineProject } from 'rstack/test';

define.app({
  // 由两个内联项目共享
});

define.test({
  projects: [
    defineInlineProject({
      name: 'node',
      include: ['./tests/node/**/*.test.ts'],
      testEnvironment: 'node',
    }),
    defineInlineProject({
      name: 'dom',
      include: ['./tests/dom/**/*.test.tsx'],
      testEnvironment: 'happy-dom',
    }),
  ],
});
```

Rstack CLI 会将对应的适配器应用到每个未设置 `extends` 的内联项目。函数形式的 `define.app()` 或 `define.lib()` 配置只会解析一次，再由这些内联项目共享。

按项目名称运行单个项目：

```bash
rs test --project dom
```

完整的 React SSR 示例请参阅 [`examples/test-inline-projects`](https://github.com/rstackjs/rstack-cli/tree/main/examples/test-inline-projects)，该示例使用 Node.js 和 happy-dom 两种测试环境。

### 外部项目 \{#external-projects}

使用字符串形式的配置项加载外部项目：

```ts title="rstack.config.ts"
import { define } from 'rstack';

define.test({
  projects: ['./legacy/rstest.config.ts'],
});
```

Rstack CLI 会将字符串形式的项目原样传给 Rstest。外部项目会加载自己的配置，不会继承当前的 `define.app()` 或 `define.lib()` 配置。每个项目需要独立管理配置时，请使用外部项目。
