You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Vitest在Svelte中测试Storybook的组件故事?

在Svelte中测试Storybook组件故事的实现方式

在Svelte生态里,你可以通过@storybook/testing-svelte包提供的composeStory和composeStories函数,实现和React中类似的Storybook故事单元测试能力,具体操作步骤如下:

1. 安装依赖

先安装所需的测试工具包:

npm install --save-dev @storybook/testing-svelte @testing-library/svelte @testing-library/jest-dom

如果用pnpm或yarn,替换成对应的包管理命令即可。

2. 导入并组合故事

假设你有一个Button.svelte组件,对应的故事文件Button.stories.js是标准Storybook格式:

// Button.stories.js
import Button from './Button.svelte';

export default {
  title: 'Button',
  component: Button,
  argTypes: {
    label: { control: 'text' },
    onClick: { action: 'clicked' },
  },
};

export const Primary = {
  args: {
    label: 'Primary Button',
    primary: true,
  },
};

在测试文件中,导入故事的meta配置和具体story,用composeStory组合成可测试的组件:

// Button.test.js
import { render, fireEvent } from '@testing-library/svelte';
import { composeStory } from '@storybook/testing-svelte';
import meta, { Primary } from './Button.stories';

// 组合Primary故事,生成可直接测试的组件
const PrimaryButton = composeStory(Primary, meta);

3. 编写单元测试

接下来就可以像测试普通Svelte组件一样编写测试逻辑:

test('primary button renders correctly and triggers click', async () => {
  const handleClick = jest.fn();
  
  // 渲染组合后的故事组件,可按需覆盖原故事的参数
  const { getByText } = render(PrimaryButton, {
    props: {
      onClick: handleClick,
    },
  });

  const button = getByText('Primary Button');
  // 验证组件渲染状态
  expect(button).toBeInTheDocument();
  
  // 触发点击事件并断言回调执行
  await fireEvent.click(button);
  expect(handleClick).toHaveBeenCalledTimes(1);
});

批量处理多个故事

如果需要测试多个故事,可使用composeStories函数一次性导入并组合所有故事:

import { composeStories } from '@storybook/testing-svelte';
import meta from './Button.stories';

// 生成所有故事对应的可测试组件
const { Primary, Secondary } = composeStories(meta);

// 后续可分别对Primary、Secondary组件编写测试用例

内容的提问来源于stack exchange,提问作者Florat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 07:46:03