3

最小限のロジックでかなり複雑なプログラム アーキテクチャを使用していますが、多くのイベント ハンドラーが渡されます。私はサーバー フレームワークのスケルトンを作成しており、次のクラスがあります。

Core、リッスンします:

CommHandler、リッスンします:

CommLayer、リッスンします:

IServerMock、モッキング フレームワーク (MOQ) でスタブします。

イベントによってトリガーされるこのような関係を単体テストする最良の方法は何ですか? 単体テストが非常に分離された粒状のものであることはわかっていますが、これをテストする唯一の方法は、プロセス全体をテストし、Core からの最終出力を確認することです。

4

2 に答える 2

5

各クラスの抽象化を行う必要があるため、 notなどCoreに依存します。依存関係はコンストラクターを介して提供する必要があります。そうすれば、依存関係をモックできるため、各クラスを分離して簡単にテストできます。ICommHandlerCommHandler

public class Core
{
    private ICommHandler commHandler;

    public Core(ICommHandler commHandler)
    {
        this.commHandler = commHandler;
    }
}

本番コードでは、これを行うことができます:

var core = new Core(new CommHandler());

独自の依存関係があるため、IOC コンテナーを使用してオブジェクトのインスタンス化を管理する方がよいでしょうがCommHandler、個別に調べる必要があります。

次に、単体テストでこれを行うことができます:

[Test]
public void TestSomeCommHandlerEvent()
{
     var mockCommHandler = new Mock<ICommHandler>();
     // set up the mock

     var core = new Core(mockCommHandler.Object);
}

これにより、テスト内の ICommHandler の実装を、動作を構成できるモックに置き換えることができます。

于 2012-12-18T18:40:39.077 に答える
3

イベントをモックして、リスナーが正しいアクションを実行する (つまり、独自のイベントを呼び出す) ことを確認できるように思えます。例えば:

// Create objects
var commLayerMock = new Mock<ICommLayer>();
var commHandler = new CommHandler(commLayerMock.Object);

// subscribe to CommHandler event
bool raised = false;
commHandler.OnCommHandlerEvent += delegate { raised = true; };

// Raise CommLayer event, ensure CommHandler event was subsequently raised
commLayerMock.Raise(m => m.OnCommLayerEvent += null, new CommLayerEventArgs());
Assert.True(raised);

各レベル間の相互作用が適切に機能する場合、チェーン全体が適切に機能することがわかるように、おそらくすべてのレベルでこのようなことを行いたいと思うでしょう。

于 2012-12-18T18:49:01.833 に答える