イベントにEventHandlerが割り当てられていることをテストする
-
05-07-2019 - |
質問
クラスにイベントに割り当てられたEventHandlerがあることをテストしたいです。基本的には、IoCコンテナーを使用してEventHandlerを接続し、適切に割り当てられていることを確認したいと考えています。本当に、IoCの設定をテストしています。
[Test]
public void create_person_event_handler_is_hooked_up_by_windsor()
{
IChangePersonService changePersonService = IoC.Resolve<IChangePersonService>();
// check that changePersonService.PersonCreated has a handler attached
}
changePersonService.PersonCreatedに何かが付加されているかどうかをテストする方法がわかりません。
アイデアはありますか
ありがとう。
解決
これで何をするふりをするのではなく、登録されたイベントをテストして列挙する唯一の方法は、自分のコレクションに登録することです。
この例を参照してください:
public class MyChangePersonService : IChangePersonService
{
private IList<EventHandler> handlers;
private EventHandler _personEvent;
public event EventHandler PersonCreated
{
add
{
_personEvent += value;
handlers.Add(value);
}
remove
{
_personEvent -= value;
handlers.Remove(value);
}
}
public IList<EventHandler> PersonEventHandlers { get { return handlers; } }
public MyChangePersonService()
{
handlers = new List<EventHandler>();
}
public void FirePersonEvent()
{
_personEvent(this, null);
}
}
その後、prop PersonEventHandlers
を使用して、登録されたハンドラーにアクセスできます。
このようなものを実装できますか?
他のヒント
キャッスルウィンザーの単体テストを試みているようです。おそらく既に単体テストがあるので、これは労力の無駄だと思います。オブジェクトが適切なタイミングで適切なイベントを発生させることをテストする方が良いでしょう(おそらく、イベントハンドラとしてモックオブジェクトを登録することによって)。
これは実際には単体テストではなく、統合テストです。そして、Castle Windsorではなく、その構成をテストしています。分離されたすべてのクラスが意図したとおりに接続されていることをテストしています。
最終的に、自分の構成が必要に応じてイベントを正しくフックしていることをテストしたいのですが、Yvalが言うようにAPIを変更せずにC#で許可されるかどうかはわかりません。
何かをアサートするためにオブジェクトから情報をプロッドしようとしているように聞こえます。機能をテストしているわけではないため、これは必ずしも単体テストではないことに注意してください。
これをテストする必要がある場合、登録済みのイベントハンドラーを取得するには、 IChangePersonService
でパブリックAPIを開く必要があるようです。