修复 Components 和 Scene 模块测试问题

1. GameObject 析构函数:从全局注册表移除自己,防止悬挂指针
2. SceneManager 测试:事件订阅后正确 Unsubscribe,防止 lambda 销毁后悬挂调用
3. SceneManager 测试:使用唯一场景名称避免覆盖问题
This commit is contained in:
2026-03-22 02:10:32 +08:00
parent 1358bb0a5a
commit 3357de85c9
2 changed files with 10 additions and 7 deletions

View File

@@ -22,6 +22,7 @@ GameObject::GameObject(const std::string& name)
} }
GameObject::~GameObject() { GameObject::~GameObject() {
GetGlobalRegistry().erase(m_id);
if (m_transform) { if (m_transform) {
delete m_transform; delete m_transform;
m_transform = nullptr; m_transform = nullptr;

View File

@@ -60,14 +60,14 @@ TEST(SceneManager_Test, GetScene_NotExists) {
TEST_F(SceneManagerTest, GetAllScenes_ReturnsAll) { TEST_F(SceneManagerTest, GetAllScenes_ReturnsAll) {
SceneManager& sm = SceneManager::Get(); SceneManager& sm = SceneManager::Get();
size_t initialCount = sm.GetAllScenes().size(); size_t beforeCount = sm.GetAllScenes().size();
sm.CreateScene("Scene1"); sm.CreateScene("GetAllScenes_TestScene1");
sm.CreateScene("Scene2"); sm.CreateScene("GetAllScenes_TestScene2");
sm.CreateScene("Scene3"); sm.CreateScene("GetAllScenes_TestScene3");
auto scenes = sm.GetAllScenes(); auto scenes = sm.GetAllScenes();
EXPECT_EQ(scenes.size(), initialCount + 3); EXPECT_EQ(scenes.size(), beforeCount + 3);
} }
TEST(SceneManager_Test, SetActiveScene) { TEST(SceneManager_Test, SetActiveScene) {
@@ -123,13 +123,14 @@ TEST(SceneManager_Test, UnloadScene_ByName) {
TEST(SceneManager_Test, OnSceneLoaded_Event) { TEST(SceneManager_Test, OnSceneLoaded_Event) {
SceneManager& sm = SceneManager::Get(); SceneManager& sm = SceneManager::Get();
bool eventFired = false; bool eventFired = false;
sm.OnSceneLoaded().Subscribe([&eventFired](Scene*) { uint64_t subId = sm.OnSceneLoaded().Subscribe([&eventFired](Scene*) {
eventFired = true; eventFired = true;
}); });
sm.CreateScene("TestScene"); sm.CreateScene("TestScene");
EXPECT_TRUE(eventFired); EXPECT_TRUE(eventFired);
sm.OnSceneLoaded().Unsubscribe(subId);
} }
TEST(SceneManager_Test, OnActiveSceneChanged_Event) { TEST(SceneManager_Test, OnActiveSceneChanged_Event) {
@@ -138,13 +139,14 @@ TEST(SceneManager_Test, OnActiveSceneChanged_Event) {
Scene* scene2 = sm.CreateScene("Scene2"); Scene* scene2 = sm.CreateScene("Scene2");
bool eventFired = false; bool eventFired = false;
sm.OnActiveSceneChanged().Subscribe([&eventFired](Scene*) { uint64_t subId = sm.OnActiveSceneChanged().Subscribe([&eventFired](Scene*) {
eventFired = true; eventFired = true;
}); });
sm.SetActiveScene(scene2); sm.SetActiveScene(scene2);
EXPECT_TRUE(eventFired); EXPECT_TRUE(eventFired);
sm.OnActiveSceneChanged().Unsubscribe(subId);
} }
TEST(SceneManager_Test, CreateScene_MultipleScenes) { TEST(SceneManager_Test, CreateScene_MultipleScenes) {