2014年4月19日 星期六

[AS] 簡易的事件機制的單元測試


上一篇 介紹了一個 簡單的事件機制類別

主要的需求是
1. 可以註冊監聽事件.
2. 可以移除單一事件
3. 可以移除全部的事件
4. 可以傳遞參數
5. 不同於 flash 基本的事件機制.

下面我基於這幾個需求寫了一些單元測試!

1. 可以註冊監聽事件.

        [Test]
        public function testSendEvent():void
        {
            EventManager.getInstancet().addListener(TEST_SEND_EVENT, _mock.handler);
            EventManager.getInstancet().sendEvent(TEST_SEND_EVENT);
            assertEquals(_isGetEvent, true);
        }


2. 可以移除單一事件
        [Test]
        public function testRemoveEvent():void
        {
            EventManager.getInstancet().addListener(TEST_REMOVE_EVENT, _mock.handler);
            EventManager.getInstancet().removeListener(TEST_REMOVE_EVENT, _mock.handler);
            EventManager.getInstancet().sendEvent(TEST_REMOVE_EVENT);
            assertEquals(_isGetEvent, false);
        }


3. 可以移除全部的事件
        [test]
        public function testRemoveEventAllListener():void
        {
            var EVENT_ONE:String = 'EVENT_ONE';
            var EVENT_TWO:String = 'EVENT_TWO';
           
            _mock.eventOneCount = 0;
            _mock.eventOnTwoCount = 0;
           
            _mock.handlerEvent1 = function():void
            {
                _mock.eventOneCount++;
            };
            _mock.handlerEvent2 = function():void
            {
                _mock.eventOneCount++;
            };
            _mock.handlerEvent3 = function():void
            {
                _mock.eventOneCount++;
            };
            _mock.handlerEvent4 = function():void
            {
                _mock.eventOnTwoCount++;
            };
           
            EventManager.getInstancet().addListener(EVENT_ONE, _mock.handlerEvent1);
            EventManager.getInstancet().addListener(EVENT_ONE, _mock.handlerEvent2);
            EventManager.getInstancet().addListener(EVENT_ONE, _mock.handlerEvent3);
            EventManager.getInstancet().addListener(EVENT_ONE, _mock.handlerEvent4);
           
            EventManager.getInstancet().addListener(EVENT_TWO, _mock.handlerEvent4);
           
            EventManager.getInstancet().removeListenerAll(EVENT_ONE);
           
            EventManager.getInstancet().sendEvent(EVENT_ONE);
            EventManager.getInstancet().sendEvent(EVENT_TWO);
           
            if(_mock.eventOneCount == 0 && _mock.eventOnTwoCount == 1)
                assertEquals(true, true);
        }


4.可以傳遞參數
        [test]
        public function testSendParmas():void
           
        {
            EventManager.getInstancet().addListener(TEST_PARAMS_EVENT, _mock.handlerParams);
            EventManager.getInstancet().sendEvent(TEST_PARAMS_EVENT, TEST_MSG, TEST_MSG2);
        }


5. 不同於 flash 基本的事件機制.
EventManager.getInstancet().addListener(eventType:String, handler:Function);
EventManager.getInstancet().sendEvent(eventType:String, ...args);


所以主要的需求都有相關的 test case,

然後針對一些這個類別使用上的問題,

也都有相關的 test case 讓使用者可以了解一些使用的限制,

像是可以註冊兩個一樣事件 一樣監聽函數

發送一次事件可以執行兩次! 移除時也只會移除一個

監聽事件的執行的位置! 傳送的參數有差別時會出現那些錯誤!

監聽函數的執行順序, 傳入空監聽的情況,

各種使用上的特殊情況, 正常情況都記錄起來

未來有需求在修改這個類別後

可以在進行一次這些測試! 

用來證明以前的需求, 在修改後不會產生錯誤!

下面是全的 test case 的 code
package
{
    import com.tenchiwang.manager.EventManager;
    import com.tenchiwang.unitTest.BasicUnitTestCase;
   
    public class demo3 extends BasicUnitTestCase
    {
       
        private var _isGetEvent:Boolean = false;
        private var _mock:Object;
       
        private const TEST_SEND_EVENT:String      = 'TEST_SEND_EVENT';
        private const TEST_REMOVE_EVENT:String    = 'TEST_REMOVE_EVENT';
        private const TEST_PARAM_EVENT:String     = 'TEST_PARAM_EVENT';
        private const TEST_PARAMS_EVENT:String    = 'TEST_PARAMS_EVENT';
        private const TEST_CURRENT_REMOVE:String  = 'TEST_CURRENT_REMOVE';
        private const TEST_ORDER_EVENT:String     = 'TEST_ORDER_EVENT';
       
        private const TEST_MSG:String  = 'TEST_MSG';
        private const TEST_MSG2:String = 'TEST_MSG2';
       
        //============== 正常案例   && 邊界案例
        [Test]
        public function testSendEvent():void
        {
            EventManager.getInstancet().addListener(TEST_SEND_EVENT, _mock.handler);
            EventManager.getInstancet().sendEvent(TEST_SEND_EVENT);
            assertEquals(_isGetEvent, true);
        }
       
        [Test]
        public function testRemoveEvent():void
        {
            EventManager.getInstancet().addListener(TEST_REMOVE_EVENT, _mock.handler);
            EventManager.getInstancet().removeListener(TEST_REMOVE_EVENT, _mock.handler);
            EventManager.getInstancet().sendEvent(TEST_REMOVE_EVENT);
            assertEquals(_isGetEvent, false);
        }
       
        [test]
        public function testSendParma():void
        {
            EventManager.getInstancet().addListener(TEST_PARAM_EVENT, _mock.handlerParam);
            EventManager.getInstancet().sendEvent(TEST_PARAM_EVENT, TEST_MSG);
        }
       
        [test]
        public function testSendParmas():void
           
        {
            EventManager.getInstancet().addListener(TEST_PARAMS_EVENT, _mock.handlerParams);
            EventManager.getInstancet().sendEvent(TEST_PARAMS_EVENT, TEST_MSG, TEST_MSG2);
        }
       
        [test]
        public function testCurrentRemove():void
        {
            EventManager.getInstancet().addListener(TEST_CURRENT_REMOVE, _mock.handlerCurrent);
            EventManager.getInstancet().addListener(TEST_CURRENT_REMOVE, _mock.handlerRemoveCurrent);
           
            EventManager.getInstancet().removeListener(TEST_CURRENT_REMOVE, _mock.handlerRemoveCurrent);
           
            EventManager.getInstancet().sendEvent(TEST_CURRENT_REMOVE);
           
            assertEquals(_isGetEvent, true);
        }
       
        [test]
        public function testCurrentRemove2():void
        {
            _mock.handlerCurrent = function():void
            {
                _isGetEvent  = false;
            }
           
            _mock.handlerRemoveCurrent = function():void
            {
                _isGetEvent = true;
            }
           
            EventManager.getInstancet().addListener(TEST_CURRENT_REMOVE, _mock.handlerCurrent);
            EventManager.getInstancet().addListener(TEST_CURRENT_REMOVE, _mock.handlerRemoveCurrent);
           
            EventManager.getInstancet().removeListener(TEST_CURRENT_REMOVE, _mock.handlerCurrent);
           
            EventManager.getInstancet().sendEvent(TEST_CURRENT_REMOVE);
           
            assertEquals(_isGetEvent, true);
        }
       
        [test]
        public function testOrder():void
        {
            _mock.order = 0;
            _mock.handlerOrder1 = function():void
            {
                if(_mock.order == 0)
                    _mock.order = 1;
            };
               
            _mock.handlerOrder2 = function():void
            {
                if(_mock.order == 1)
                    _mock.order = 2;
            };
           
            EventManager.getInstancet().addListener(TEST_ORDER_EVENT, _mock.handlerOrder1);
            EventManager.getInstancet().addListener(TEST_ORDER_EVENT, _mock.handlerOrder2);
           
            EventManager.getInstancet().sendEvent(TEST_ORDER_EVENT);
           
            assertEquals(_mock.order, 2);
        }
       
        [test]
        public function testDouble():void
        {
            var TEST_DOUBLE_EVENT:String = 'TEST_DOUBLE_EVENT';
           
            _mock.count = 0;
            _mock.handlerDouble = function():void
            {
                _mock.count++;
            };
           
           
            EventManager.getInstancet().addListener(TEST_DOUBLE_EVENT, _mock.handlerDouble);
            EventManager.getInstancet().addListener(TEST_DOUBLE_EVENT, _mock.handlerDouble);
           
            EventManager.getInstancet().sendEvent(TEST_DOUBLE_EVENT);
           
            assertEquals(_mock.count, 2);
        }
       
        [test]
        public function testRemoveDouble():void
        {
            var TEST_REMOVE_DOUBLE_EVENT:String = 'TEST_REMOVE_DOUBLE_EVENT';
           
            _mock.count = 0;
            _mock.handlerDouble = function():void
            {
                _mock.count++;
            };
           
            EventManager.getInstancet().addListener(TEST_REMOVE_DOUBLE_EVENT, _mock.handlerDouble);
            EventManager.getInstancet().addListener(TEST_REMOVE_DOUBLE_EVENT, _mock.handlerDouble);
           
            EventManager.getInstancet().removeListener(TEST_REMOVE_DOUBLE_EVENT, _mock.handlerDouble);
           
            EventManager.getInstancet().sendEvent(TEST_REMOVE_DOUBLE_EVENT);
           
            assertEquals(_mock.count, 1);
        }
       
        [test]
        public function testRemoveEventAllListener():void
        {
            var EVENT_ONE:String = 'EVENT_ONE';
            var EVENT_TWO:String = 'EVENT_TWO';
           
            _mock.eventOneCount = 0;
            _mock.eventOnTwoCount = 0;
           
            _mock.handlerEvent1 = function():void
            {
                _mock.eventOneCount++;
            };
            _mock.handlerEvent2 = function():void
            {
                _mock.eventOneCount++;
            };
            _mock.handlerEvent3 = function():void
            {
                _mock.eventOneCount++;
            };
            _mock.handlerEvent4 = function():void
            {
                _mock.eventOnTwoCount++;
            };
           
            EventManager.getInstancet().addListener(EVENT_ONE, _mock.handlerEvent1);
            EventManager.getInstancet().addListener(EVENT_ONE, _mock.handlerEvent2);
            EventManager.getInstancet().addListener(EVENT_ONE, _mock.handlerEvent3);
            EventManager.getInstancet().addListener(EVENT_ONE, _mock.handlerEvent4);
           
            EventManager.getInstancet().addListener(EVENT_TWO, _mock.handlerEvent4);
           
            EventManager.getInstancet().removeListenerAll(EVENT_ONE);
           
            EventManager.getInstancet().sendEvent(EVENT_ONE);
            EventManager.getInstancet().sendEvent(EVENT_TWO);
           
            if(_mock.eventOneCount == 0 && _mock.eventOnTwoCount == 1)
                assertEquals(true, true);
        }
       
        //================ 錯誤案例!
        [test]
        public function testMoreParamError():void
        {
            var TEST_MORE_PARAMS:String = 'TEST_MORE_PARAMS';
           
            _mock.count = 0;
            _mock.handler2 = function(msg:String):void
            {
                if(msg == TEST_MSG)
                    _mock.count++;
            };
           
            EventManager.getInstancet().addListener(TEST_MORE_PARAMS, _mock.handler2);
            try
            {
                EventManager.getInstancet().sendEvent(TEST_MORE_PARAMS, TEST_MSG, TEST_MSG2);               
            }
            catch(error:Error)
            {
                assertEquals(_mock.count, 0);
            }
           
        }
       
        [test]
        public function testlessParamError():void
        {
            var TEST_LESS_PARAMS:String = 'TEST_LESS_PARAMS';
           
            _mock.count = 0;
            _mock.handler2 = function(msg:String, msg2:String):void
            {
                _mock.count++;
            };
           
            EventManager.getInstancet().addListener(TEST_LESS_PARAMS, _mock.handler2);
            try
            {
                EventManager.getInstancet().sendEvent(TEST_LESS_PARAMS, TEST_MSG);               
            }
            catch(error:Error)
            {
                assertEquals(_mock.count, 0);
            }
           
        }
       
        //================ 特殊案例
       
        [test]
        public function testFunctionLocal():void
        {
            var TEST_LOCAL:String = 'TEST_LOCAL';
           
            _mock.handler = function(msg:String):void
            {
                if(this == EventManager.getInstancet())
                    assertEquals(true, true);
            };
           
            EventManager.getInstancet().addListener(TEST_LOCAL, _mock.handler);
            EventManager.getInstancet().sendEvent(TEST_LOCAL, TEST_MSG);               
           
        }
       
        [test]
        public function testMoreParam():void
        {
            var TEST_MORE_PARAM:String = 'TEST_MORE_PARAM';
            var TEST_MORE_PARAMS:String = 'TEST_MORE_PARAMS';
           
            _mock.count = 0;
            _mock.handler = function():void
            {
                _mock.count++;
            };
               
            EventManager.getInstancet().addListener(TEST_MORE_PARAM, _mock.handler);
            EventManager.getInstancet().addListener(TEST_MORE_PARAMS, _mock.handler);
           
            EventManager.getInstancet().sendEvent(TEST_MORE_PARAM, TEST_MSG);
            EventManager.getInstancet().sendEvent(TEST_MORE_PARAMS, TEST_MSG, TEST_MSG2);
           
            assertEquals(_mock.count, 2);
        }
       
        [test]
        public function testNullHandler():void
        {
           
            var TEST_FUNCTION_NULL:String = 'TEST_FUNCTION_NULL';
            _mock.count = 0;
            _mock.handler = function(msg:String):void
            {
                if(msg == TEST_MSG)
                    _mock.count++;
            };
           
            EventManager.getInstancet().addListener(TEST_FUNCTION_NULL, _mock.handler);
           
            _mock.handler = null;
           
            EventManager.getInstancet().sendEvent(TEST_FUNCTION_NULL, TEST_MSG);   
           
            assertEquals(_mock.count, 1);
        }

        [test]
        public function testNullObject():void
        {
           
            var TEST_OBJECT_NULL:String = 'TEST_OBJECT_NULL';
            _mock.handler = function(msg:String):void
            {
                _isGetEvent = true;
            };
           
            EventManager.getInstancet().addListener(TEST_OBJECT_NULL, _mock.handler);
           
            _mock = null;
           
            EventManager.getInstancet().sendEvent(TEST_OBJECT_NULL, TEST_MSG);                   
            assertEquals(_isGetEvent, true);
           
        }       
       
        //================
       
        override protected function startUp():void
        {
            _isGetEvent = false;
           
            _mock = new Object();
            _mock.handler = function():void
            {
                _isGetEvent = true;
            };
           
            _mock.handlerParam = function(msg:String):void
            {
                assertEquals(msg, TEST_MSG);
            };
               
            _mock.handlerParams = function(msg:String, msg2:String):void
            {
                var flag:Boolean  = (msg == TEST_MSG);
                var flag2:Boolean = (msg2 == TEST_MSG2);
               
                if(flag && flag2)
                    assertEquals(true, true);
            };
           
            _mock.handlerCurrent = function():void
            {
                _isGetEvent  = true;
            }
           
            _mock.handlerRemoveCurrent = function():void
            {
                _isGetEvent = false;
            }
        }
       
        override protected function shutdown():void
        {
            _mock = null;
            EventManager.getInstancet().clearAll();
        }
    }
}


使用自製的 Unit Test , 執行測試並且顯示的網頁.

沒有留言 :