From 015edc5b6a084292e643fecebd3c087f1a9557f6 Mon Sep 17 00:00:00 2001 From: xfy Date: Fri, 26 Jun 2026 09:34:17 +0800 Subject: [PATCH] =?UTF-8?q?test(post=5Fdetail):=20=E9=94=81=E5=AE=9A=20slu?= =?UTF-8?q?g=20=E9=87=8D=E5=8F=96=E4=B8=8D=E5=86=8D=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E9=95=9C=E5=83=8F=20signal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 防止 post_detail.rs 回退到 render 期 set signal 反模式(commit 225bb24 已修)。 用源码字符串契约断言,与 theme.rs 的 preload-script 测试同模式。 --- tests/post_detail_slug_rerun.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 tests/post_detail_slug_rerun.rs diff --git a/tests/post_detail_slug_rerun.rs b/tests/post_detail_slug_rerun.rs new file mode 100644 index 0000000..3536efe --- /dev/null +++ b/tests/post_detail_slug_rerun.rs @@ -0,0 +1,26 @@ +//! 回归测试:锁定 PostDetail 组件不再用镜像 signal 触发 server future。 +//! +//! 背景:src/pages/post_detail.rs 曾用 `use_signal(|| slug.clone())` 镜像 slug prop, +//! 并在 render 期 `if slug_signal() != slug { slug_signal.set(...) }` 触发重取—— +//! 这是 Dioxus antipatterns 明确点名的「render body 副作用」。 +//! 已在 commit 225bb24 改为直接读 prop。本测试通过源码字符串断言防止回退。 + +/// PostDetail 组件源码不得包含镜像 slug 的 signal 反模式签名。 +#[test] +fn post_detail_does_not_mirror_slug_into_signal() { + let src = include_str!("../src/pages/post_detail.rs"); + + // 反模式签名:用 use_signal 镜像 slug prop。 + assert!( + !src.contains("slug_signal"), + "post_detail.rs 重新引入了 slug_signal 镜像——这是 render 期 set signal 反模式。\ + 应直接在 use_server_future 闭包里读 slug prop,让 Dioxus 在 prop 变化时自动重跑。\ + 详见 .agents/skills/dioxus-render-purity/SKILL.md 规则一。" + ); + + // 反模式签名:render 期对 slug 相关 signal 调用 set。 + assert!( + !src.contains("slug_signal.set"), + "post_detail.rs 在 render 期 set signal——违反渲染纯净性。" + ); +}