6

テスト対象のクラスが希望どおりに動作していることを確認するために、単体テストで Moq を使用する方法についてアドバイスが必要です。これは、テスト対象のクラスが (Prism からの) イベント アグリゲーター イベントを発行することであり、このイベントがテストで発生したことをアサートする何らかの方法が必要です。

私は仕事に多くのリソースを持っておらず、これを設定する方法を知るのが難しいと感じています.

私は持っている :-

public SomeEvent : CompositePresentationEvent<SomeEvent>
{
   EventPayload
}

public SomeClass
{
     void Allocate(){EventAggregator.Publish<SomeEvent>}
}

public SomeService : IService
{
     SomeService(){ EventAggregator.Subscribe<SomeEvent>(DoSomething)}
     void DoSomething(SomeEvent evt){}
}

私のテストが SomeClass の場合、 SomeClass.Allocate を呼び出すと SomeEvent メッセージが公開されていることを確認する必要があると思います。これはどのように行われますか?

モックされた SomeService が SomeEvent を受け取っていることも確認する必要がありますか? それとも、SomeClass ではなく SomeService 単体テストに属する別の単体テストですか?

いずれにせよ、これを設定する方法がわからないので、アドバイスをいただければ幸いです。

4

1 に答える 1

11

を指定するSomeClassと、IEventAggregatorテスト中にモックを指定できるようになります。

public SomeClass(IEventAggregator eventAggregator)
{
     _eventAggregator = eventAggregator;
}

次に、テストは次のようになります。

var fakeEventAggregator = new Mock<IEventAggregator>();
var fakeEvent = new Mock<SomeEvent>();

fakeEventAggregator.
    Setup(x => x.GetEvent<SomeEvent>()).
    Returns(fakeEvent.Object);

var test = new SomeClass(fakeEventAggregator.Object);
test.Allocate();

fakeEvent.Verify(x => x.Publish(It.IsAny<SomeEventArgs>()));

これらが単体テストの場合は、テストでサブスクリプションを完全に個別にSomeServiceテストします。SomeClassイベントを正しくパブリッシュし、SomeService処理するイベントが与えられたときに正しく動作することをテストしています。

于 2010-09-12T09:58:34.170 に答える