fix(ai): 应用 Task 1+2 代码审查意见

ResourceFull 未挂 BossResource 时改为显式抛——原先静默返回 false,
是 CLAUDE.md 第 6 条禁止的下游兜底,且与紧邻的 Boss facet 行为不一致。
FakeBossControl.DistanceToAnchor 不再忽略 index。测试改用 TearDown 清理
(本项目关闭了 Domain/Scene Reload,失败断言会把物体永久留在打开的场景里)。
BeginPhaseTransition 去掉死的默认参数;接口补充重入契约说明。

顺带去重:FakeAiContext 实现 IEnemyActor,删除两个测试内的本地 Ctx 副本
——一个接口成员改动要同步三份是复发性成本。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-30 12:31:39 +08:00
co-authored by Claude Opus 5
parent 3665504a58
commit 2a1ada4388
7 changed files with 60 additions and 77 deletions
@@ -8,14 +8,26 @@ namespace BaseGames.Tests.EditMode.Enemies
{
public class EnemyBrainContextBossFacetTests
{
// EnemyBase.Awake 会对缺失的碰撞体/引用报错,这些与本测试无关。
[SetUp] public void SetUp() => LogAssert.ignoreFailingMessages = true;
[TearDown] public void TearDown() => LogAssert.ignoreFailingMessages = false;
// 本项目关闭了 Domain/Scene ReloadEditMode 测试跑在当前打开的场景上:
// 建出来的物体必须在 TearDown 里销毁,断言失败时才不会把物体永久留在场景里。
GameObject _go;
static T MakeEnemy<T>(string name) where T : EnemyBase
// EnemyBase.Awake 会对缺失的碰撞体/引用报错,这些与本测试无关。
[SetUp]
public void SetUp() => LogAssert.ignoreFailingMessages = true;
[TearDown]
public void TearDown()
{
var go = new GameObject(name);
return go.AddComponent<T>();
LogAssert.ignoreFailingMessages = false;
if (_go != null) UnityEngine.Object.DestroyImmediate(_go);
_go = null;
}
T MakeEnemy<T>(string name) where T : EnemyBase
{
_go = new GameObject(name);
return _go.AddComponent<T>();
}
[Test]
@@ -25,8 +37,6 @@ namespace BaseGames.Tests.EditMode.Enemies
var ctx = new EnemyBrainContext(enemy);
Assert.Throws<InvalidOperationException>(() => { var _ = ctx.Boss; });
UnityEngine.Object.DestroyImmediate(enemy.gameObject);
}
[Test]
@@ -38,9 +48,8 @@ namespace BaseGames.Tests.EditMode.Enemies
Assert.AreSame(boss, ctx.Boss);
Assert.AreEqual(0, ctx.Boss.CurrentPhase);
Assert.IsFalse(ctx.Boss.IsPhaseTransitioning);
Assert.IsFalse(ctx.Boss.ResourceFull); // 未挂 BossResource
UnityEngine.Object.DestroyImmediate(boss.gameObject);
// 未挂 BossResource:图查询资源满值属配置错误,必须抛而不是静默返回 false
Assert.Throws<InvalidOperationException>(() => { var _ = ctx.Boss.ResourceFull; });
}
}
}