« 今日はやなものを3つ見た | トップページ | FieldAccessExceptionでハマる »

2008.06.03

.NETのイベント強制発生と動的型生成

今日は純粋に技術的な話題。

.NET(とくにWindows Forms)においては、ふつう外部のイベントを強制的に発生させることはできないことになっている。いろいろぐぐっても特に情報はない。
でも、リフレクションを使えば何とかなるのでは? と思い立って、この前の週末にちょっと予備調査としてSystem.Windows.Forms.dllをディスアセンブラにかけて解析してみた。(サンデープログラミングとしては格好のネタだ)
 その結果十分いけそうという感触を得たので、今後隙をみてこの機能を使うライブラリを整備していくつもり。

これで何がやりたいかというと、GUIアプリケーションをNUnitでテストするカバー率を上げるのだ。ドラッグ&ドロップ系統やMouseEnter/Leaveというイベントを自在に発行できればテストは圧倒的にやりやすくなる。

ちなみに、OnMouseEnter等のprotectedメソッドをリフレクションを使って直接呼ぶのは、自分のイベントハンドラだけでなくWindows.Forms内の実装も実行されてしまい、副作用の危険が大である。あくまでも自分でくっつけたdelegateだけを呼ぶのがポイント。

さらに、このテクニックと、動的な型生成(System.Reflection.Emitにある一連の機能)を組み合わせるとテストコードの記述性は新しい次元になる。

動的な型生成はJavaにはないのでJUnitにこのアイデアを使うのは無理かなあ。型生成は面白いんだが、メソッドの定義はMSILを直接使わなくちゃいけないので、足し算ひとつするんでも

g.Emit(OpCodes.Ldarg_1);
g.Emit(OpCodes.Ldarg_2);
g.Emit(OpCodes.Add);

 こんな感じである。

 ある程度出来上がったらちゃんと使い方をまとめて公開する予定です。NUnitの人たちにもアナウンスしたいのでドキュメントは英語でも書かないと...

|

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/73665/41416016

この記事へのトラックバック一覧です: .NETのイベント強制発生と動的型生成:

» child whole life insurance [child whole life insuranceから]
amenable perish drunks pulpits:cheap life insurance [url=http://www.cpoevents.com/cheap-life-insurance.html]cheap life insurance[/url] http://www.cpoevents.com/cheap-life-insurance.html 続きを読む

受信: 2008/06/11 19:21:55

コメント

ちょっと何いってるかわからない byサンドウイッチマン  

投稿者: (2008/06/04 11:09:43)

コメントを書く