NUnit と C# を使用して、昔ながらの COM/ActiveX コントロールの単体テストを行っています。私がテストしているコントロールは主に javascript から使用されているため、参照やコンパイル時の型情報はありません。もちろん、すべてを動的に実行します。いくつかのイベント ハンドラーを接続して、イベントが適切に発生していることを確認したいのですが、イベントが見つかりません。次のように、System.Activator.CreateInstance を使用してコントロールのインスタンスを動的に構築します (一部の詳細は省略 ;-):
Type T = Type.GetTypeFromCLSID(guid);
eztwain = System.Activator.CreateInstance(T);
EZTwainX = eztwain.GetType();
プロパティとメソッドのテストは、次のように正常に機能します。
EZTwainX.InvokeMember("Clear", BindingFlags.InvokeMethod, null, eztwain, null);
Assert.AreEqual(0, (int)EZTwainX.InvokeMember("ImageCount", BindingFlags.GetProperty, null, eztwain, null), "ImageCount");
以下はすべて失敗し、null または空の配列を返すか、必要に応じて「name not found」例外をスローします。
EZTwainX.GetEvent("AcquireDone"); // returns null
EZTwainX.GetEvents(); // returns empty array
EZTwainX.GetEvents(BindingFlags.Public | // returns empty array
BindingFlags.NonPublic |
BindingFlags.Static | BindingFlags.Instance);
PropertyInfo propertyInfo = EZTwainX.GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); // returns null
MemberInfo[] mimfo = EZTwainX.GetMember("AcquireDone", MemberTypes.Event, BindingFlags.Public | BindingFlags.NonPublic); // returns empty array
私は、Reflection API を使用して次のようなことができると思いました (エヘム)。
eztwain.AcquireDone += <event handler>;
しかし、その等価物が何であるかを理解できません。編集:Javascriptではこれが機能する(そしてイベントをキャッチする)ため、そのコントロールのそのイベントを信じています:
eztwain.attachEvent("AcquireDone", function() { me.onAcquireDone(); });