数据填充与测试¶
模拟 Strapi 服务器¶
模拟服务器(scripts/mock-strapi.mjs)是一个轻量级的 Node.js HTTP 服务器,用于模拟 Strapi v5 REST API,使本地开发无需运行 CMS 实例。
启动方式:
node scripts/mock-strapi.mjs
服务监听地址为 http://localhost:1337。
参考数据¶
服务器在启动时会创建以下内存中的参考数据:
作者:
FlexGalaxy.AI Team``(documentId ``author-001)分类:
Features``(slug ``features;zh-CN 本地化为产品特性,ja 本地化为機能紹介)标签(16 个): efficiency、security、collaboration、data-analytics、AI、automation、scheduling、visualization、compliance、encryption、monitoring、IoT、integration、maintenance、AMR、API
文章由 seed-blog-content.mjs (9 篇功能文章) 和 seed-blog-edge-cases.mjs (11 篇边界情况文章) 合并而成,共计 20 篇。
端点¶
路径 |
行为 |
|---|---|
|
支持查询过滤的分页列表(详见下文) |
|
返回分类列表;支持 |
|
分页标签列表 |
|
返回空列表(无模拟页面) |
|
返回 204(CORS 预检请求) |
其他路径 |
返回 404 JSON |
文章查询参数:
filters[slug][$eq]=<slug>--- 按 slug 获取单篇文章filters[category][slug][$eq]=<slug>--- 按分类过滤filters[tags][slug][$eq]=<slug>--- 按标签过滤pagination[page]=<n>/pagination[pageSize]=<n>--- 分页
种子脚本¶
这些脚本通过 Admin Content Manager API 向**真实的** Strapi v5 实例填充数据。
seed-blog-articles.mjs¶
创建所有参考数据(作者、带本地化的分类、16 个标签)以及 9 篇功能文章,包含英文、中文和日文本地化内容。
STRAPI_EMAIL=admin@flexgalaxy.ai \
STRAPI_PASSWORD=Admin12345 \
node scripts/seed-blog-articles.mjs
环境变量:
变量 |
默认值 |
说明 |
|---|---|---|
|
|
Strapi 基础 URL |
|
(必填) |
管理员邮箱 |
|
(必填) |
管理员密码 |
该脚本使用以下 Strapi Content Manager UID:
api::article.articleapi::author.authorapi::category.categoryapi::tag.tag
本地化内容通过 /actions/localize 端点为 zh-CN 和 ja 创建。所有文章在创建后会自动发布。
seed-blog-content.mjs¶
导出 ARTICLES --- 一个包含 9 篇功能文章定义的数组,涵盖 FlexGalaxy.AI 仓库与工厂自动化相关主题:
# |
Slug |
标签 |
|---|---|---|
1 |
|
efficiency、data-analytics、AI |
2 |
|
scheduling、automation、AI、efficiency |
3 |
|
visualization、data-analytics、efficiency |
4 |
|
security、encryption、compliance |
5 |
|
monitoring、IoT、maintenance |
6 |
|
monitoring、maintenance、AI、automation |
7 |
|
AMR、collaboration、automation |
8 |
|
IoT、AMR、integration |
9 |
|
integration、API、automation、efficiency |
每篇文章都包含 slug、tags[] 和 locales.en.{ title, summary, content }。
seed-blog-edge-cases.mjs¶
导出 EDGE_CASE_ARTICLES --- 11 篇用于压力测试博客渲染引擎的文章:
# |
Slug |
测试内容 |
|---|---|---|
1 |
|
标题溢出与换行 |
2 |
|
h2 至 h6 标题层级 |
3 |
|
围栏代码块(TS、Python、Bash、JSON) |
4 |
|
有序、无序及嵌套列表 |
5 |
|
引用块、粗体、斜体、删除线 |
6 |
|
宽表格、对齐方式、长内容 |
7 |
|
8 节文章,滚动行为 |
8 |
|
多种图片尺寸与排列 |
9 |
|
YouTube iframe 嵌入,响应式容器 |
10 |
|
流程图、时序图、ER 图、状态图、甘特图 |
11 |
|
行内与独立 LaTeX 数学公式 |
单元测试¶
项目使用 Vitest 搭配 React Testing Library,以 jsdom 作为 DOM 环境。
# Run once (CI mode)
npm test
# Watch mode
npm run test:watch
测试套件¶
i18n.test.ts --- 测试 src/lib/i18n.ts:
语言环境配置:3 种语言环境,默认为
en,所有语言环境均有标签isValidLocale对有效语言环境返回 true,对无效的返回 falset()针对 en、zh-CN、ja 返回正确的翻译当某语言环境中缺少翻译键时回退到英文
当不存在任何翻译时返回键本身
支持在所有语言环境中使用
{placeholder}插值
strapi.test.ts --- 测试 src/lib/strapi.ts``(模拟 ``global.fetch):
fetchPublicPages发送正确的过滤和语言环境参数fetchPublicPage返回页面,未找到时返回 nullfetchPublicArticles发送分页和分类过滤参数fetchPublicArticle按 slug 返回文章fetchFeaturedArticles按featured=true过滤fetchCategories和fetchTags返回数组fetchPublicMediaCollections/fetchPublicMediaCollection返回数据在非 OK 响应时抛出
"Strapi API error: <status>"strapiMediaUrl处理 null、undefined、绝对 URL 和相对 URL
SectionRenderer.test.tsx --- 测试 CMS 区块渲染:
渲染 hero、功能网格、富文本和行动号召区块
优雅地跳过未知区块类型
无区块时渲染空输出
按正确顺序渲染多个区块