public IEnumerator Proxy_Test()
        {
            CManagerFirebase_Test pTester = CreateTesterObject(nameof(Proxy_Test));

            yield return(pTester.StartCoroutine(WaitForInit(pTester)));

            CManagerFirebase pManagerFirebase = CManagerFirebase.instance;

            int      iRandomNumber = UnityEngine.Random.Range(0, int.MaxValue);
            string   strDBKey      = "Test User ID " + iRandomNumber.ToString();
            TestData pTestData     = new TestData(strDBKey, "Test User Name" + iRandomNumber.ToString(), iRandomNumber);

            // 프록시를 통해 데이터를 삽입한다. DB에 데이터가 있으면 DB에있는 데이터가 들어온다.
            CProxy <TestData> pProxyData = new CProxy <TestData>(strDBKey, pTestData, 0.1f, OnFinish_Proxy);

            // 프록시를 통해 순간적으로 대량의 수정 요청을 한다.
            int iGoldResult = pTestData.iGold;

            for (int i = 0; i < 1000; i++)
            {
                int iGoldChangeAmount = UnityEngine.Random.Range(-100, 100);
                pProxyData.pData_RequireUpdate_Directly.iGold += iGoldChangeAmount;
                iGoldResult += iGoldChangeAmount;
            }


            // DB 갱신까지 잠시 기다린다.
            float fElpaseTime = 0f;

            while (pProxyData.p_bIsWaitServer && fElpaseTime < 5f)
            {
                fElpaseTime += Time.deltaTime;
                yield return(null);
            }

            if (fElpaseTime >= 5f)
            {
                Debug.LogError("시간 초과" + fElpaseTime);
                yield break;
            }

            _pData = null;
            Assert.IsNull(_pData);

            // DB로부터 데이터를 얻어온 데이터와 로컬의 프록시와 일치하는지 확인한다.
            yield return(pTester.StartCoroutine(pManagerFirebase.DoGetData_Single_Coroutine <TestData>(pTestData.IFirebaseData_strDBKey, OnFinishGetData_Single)));

            Assert.AreEqual(pProxyData.pData.iGold, _pData.iGold, iGoldResult);

            // 테스트를 끝낸 뒤 데이터를 삭제한다.
            yield return(pTester.StartCoroutine(pManagerFirebase.DoRemoveData_Coroutine <TestData>(pTestData, null)));

            yield break;
        }
        public IEnumerator Write_And_Read_And_Delete_Test()
        {
            CManagerFirebase_Test pTester = CreateTesterObject(nameof(Write_And_Read_And_Delete_Test));

            yield return(pTester.StartCoroutine(WaitForInit(pTester)));

            CManagerFirebase pManagerFirebase = CManagerFirebase.instance;

            _pData = null;
            Assert.IsNull(_pData);

            for (int i = 0; i < 3; i++)
            {
                int      iRandomNumber = UnityEngine.Random.Range(0, int.MaxValue);
                TestData pTestData     = new TestData("Test User ID " + iRandomNumber.ToString(), "Test User Name" + iRandomNumber.ToString(), iRandomNumber);

                // 랜덤으로 데이터를 삽입한다.
                yield return(pTester.StartCoroutine(pManagerFirebase.DoSetData_Coroutine <TestData>(pTestData, null)));

                // 테이블 내의 모든 데이터를 얻어온다.
                yield return(pTester.StartCoroutine(pManagerFirebase.DoGetData_Single_Coroutine <TestData>(pTestData.IFirebaseData_strDBKey, OnFinishGetData_Single)));

                Assert.AreEqual(_pData.IFirebaseData_strDBKey, pTestData.IFirebaseData_strDBKey);

                // 테이블 내의 모든 데이터를 얻어온다.
                yield return(pTester.StartCoroutine(pManagerFirebase.DoGetData_Multi_Coroutine <TestData>(OnFinishGetData_Multi)));

                // 랜덤으로 삽입된 데이터가 얻어온 DB에 들어있는지 확인한다.
                Assert.AreEqual(_mapDBResult[pTestData.IFirebaseData_strDBKey].IFirebaseData_strDBKey, pTestData.IFirebaseData_strDBKey);
                Assert.AreEqual(_mapDBResult.Count, 1);

                // 데이터를 삭제한다.
                yield return(pTester.StartCoroutine(pManagerFirebase.DoRemoveData_Coroutine <TestData>(pTestData, null)));
            }

            yield break;
        }
        // ===================================================================================================

        private IEnumerator WaitForInit(CManagerFirebase_Test pTester)
        {
            _mapDBResult = null;
            _bResult     = false;

            Assert.IsNull(_mapDBResult);
            Assert.IsFalse(_bResult);

            _bIsInit_FirebaseManager = false;
            CManagerFirebase pFirebaseManager = CManagerFirebase.instance;

            CManagerFirebase.p_Event_OnFinish_Initailizing.Subscribe_And_Listen_CurrentData += OnFinishInitailizing;

            float fWaitTimeSec = 0f;

            while (_bIsInit_FirebaseManager == false && fWaitTimeSec < 5f)
            {
                Debug.Log("Wait For FireBase Manager Initializing... WaitTimeSec : " + fWaitTimeSec);

                fWaitTimeSec += Time.deltaTime;
                yield return(null);
            }

            if (fWaitTimeSec >= 5f)
            {
                Debug.LogError("Error - Init Fail FirebaseManager - TimeOut");
                yield break;
            }

            // 기존에 들어있는 모든 데이터를 다 지운다.
            yield return(pTester.StartCoroutine(pFirebaseManager.DoGetData_Multi_Coroutine <TestData>(OnFinishGetData_Multi)));

            foreach (var pData in _mapDBResult.Values)
            {
                yield return(pTester.StartCoroutine(pFirebaseManager.DoRemoveData_Coroutine <TestData>(pData, null)));
            }
        }