Threadのtestってどう書くの?

最近、Threadを使ってUnion用のThreadを作る機会が多いのですが、せっかくなのでtestを書こうと思っております。testはもちろん、AS3Unitを使っています。

Threadのtestを書く方法が良く分かりません。どうやるんだろうと思い考えてみたのがこれ。TestThreadはものすごい適当です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package
{
    import flash.events.Event;
    import org.libspark.as3unit.*;
    import org.libspark.as3unit.assert.*;
    import org.libspark.thread.EnterFrameThreadExecutor;
    import org.libspark.thread.Thread;
 
    /**
     * HogeThreadTest
     */
    public class HogeThreadTest 
    {
        beforeClass static function setUp():void
        {
            // Threadの初期化をしておく
            Thread.initialize(new EnterFrameThreadExecutor());
        }
 
        test function asyncMethod():void
        {
            // testしたいThreadを生成
            var thread:HogeThreadTest = new HogeThreadTest();
 
            // test用のThreadでラップする
            var testThread:TestThread = new TestThread(thread);
 
            // test用のThread完了後にdispatchされるEvent.COMPLETEを待つ
            testThread.dispatcher.addEventListener(Event.COMPLETE, async(
            function(event:Event):void
            {
                assertTrue(thread.reactor.isConnected(),
                     "check whether connected reactor.isConnected() is true or not.");
            },1000));
 
            // test用のThreadを実行
            testThread.start();
        }
 
    }
}
 
import flash.events.Event;
import flash.events.EventDispatcher;
import org.libspark.thread.Thread;
 
/**
 * Test用のThread
 */
class TestThread extends Thread
{
    private var _dispatcher:EventDispatcher;
    /**
     * Eventを送出するためにEventDispatcherインスタンスを生成
     */
    public function get dispatcher():EventDispatcher
    {
        return _dispatcher;
    }
 
    /**
     * 保持するThreadインスタンス
     */
    private var _thread:Thread;
 
    /**
     * runメソッド
     */
    override protected function run():void
    {
        // コンストラクタで受け取ったThreadを実行
        _thread.start();
        // 実行終わるのを待つ
        _thread.join();
        // doenを実行する
        next(done);
    }
 
    private function done():void
    {
        // Event.COMPLETEを送出する
        _dispatcher.dispatchEvent(new Event(Event.COMPLETE));
    }
 
    /**
     * 引数でThreadを受け取る
     * @param    thread
     */
    function TestThread(thread:Thread):void
    {
        _dispatcher = new EventDispatcher();
        _thread = thread;
    }
}

まず、TestThreadを作っておきます。TestThreadは、run()メソッドを実行すると以下のような動作をします。

  • コンストラクタで受け取ったThreadを実行(start)して待機(join)します。
  • 受け取ったThreadが完了したら、dispatcherからEvent.COMPLETEを送出します。

testコードでは、testしたいThreadをTestThredに渡して、async()メソッドでイベントを待機します。

このようなTestThreadみたいなのって実はネイティブでどこかにあったりするんでしょうか。
みなさん、どのようにThreadのtestを書いているのでしょう?このライブラリのtestに良い例があるよ!とかあったら教えて欲しいですよ!

 

Comments

No comments so far.

Leave a Reply
 
  (will not be published)