上一篇 介紹了一個 簡單的事件機制類別
主要的需求是
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 , 執行測試並且顯示的網頁.
沒有留言 :
張貼留言