1

プロパティを適切に設定するか、結果として他のメッセージを発行することにより、モジュールが適切に応答することを確認するために、イベント集約を介してモジュールにメッセージをスローすることにより、モジュールを単体テストしたいと考えています。私は Prism 6 を使用しています。私のプロジェクトでは、インフラストラクチャ プロジェクトに次のものがあります。

 public class ImportantMessage : PubSubEvent<string>
 {
 }

ModuleA は次のようなメッセージを発行します。

eventAggregator.GetEvent<ImportantMessage>().Publish(importantString);

ModuleB は次のようなメッセージを受け取ります。

eventAggregator.GetEvent<ImportantMessage>().Subscribe(HandleImportantMessage);

これがHandleImportantMessageです:

public void HandleImportantMessage(string importantString)
{
   . . .
}

ModuleB コンストラクターは次のように呼び出されます。

ModuleB(IEventAggregator EventAggregator)

このコンストラクターは Prism フレームワークによって呼び出されます。単体テストのために、ModuleB のインスタンスを作成し、IEventAggregator (おそらく Moq によって作成された偽物) を渡す必要があります。そして、公開するメッセージに重要な文字列が含まれるように、これを行いたいと考えています。「moq とイベント集約を使用した単体テスト」というフレーズを Google で検索すると、いくつかの参考文献がありますが、これらのアプローチを使用して ModuleA から ModuleB に「importantString」を渡す方法はわかりませんでした。Prism 5 のサンプル コードは偽のイベント アグリゲーターを作成しますが、Moq は使用しません。それがどのように機能するのか理解できず、文字列を渡す方法がわかりません。

私のテストコードは次のようなものから始まります:

var moqEventAggregator = new Mock(IEventAggregator);
var moqImportantMessage = new Mock<ImportantMessage>();
moqEventAggregator.Setup(x => x.GetEvent<ImportantMessage>());

私が見た参照のいくつかは、.Returns(eventBeingListenedTo.Object); のようなものを適用します。Setup適用後のmoqEventAggregatorへ。importantString を渡すには、明らかに .Setup(something) を moqImportantMessage に適用する必要がありますが、正確にはまだわかりません。

私は何が欠けていますか?偽の公開メッセージで文字列を渡すにはどうすればよいですか?

4

1 に答える 1

0

基本的に、ここで 2 つのことをモックする必要があります。

  1. イベントアグリゲーター
  2. イベントそのもの

あなたが言ったようにあなたがする必要があるイベントのモックを持っているとすれば:

moqEventAggregator.Setup(x => x.GetEvent<ImportantMessage>()).Returns(moqImportantMessage);

イベント自体を嘲笑するのは次のようになります。

Action<string> action;
moqImportantMessage.Setup(_ => _.Subscribe(It.IsAny<Action<string>>>()))
    .Callback(_action => 
    {
        action = _action;
    });

そして、次のようにサブスクリプションを上げることができます:

action("some string");
于 2016-03-22T15:29:33.843 に答える