使用Moq,Prism 6和事件聚合进行单元测试

时间:2016-03-21 21:00:50

标签: unit-testing moq prism prism-6

我想通过事件聚合向它发送消息来对模块进行单元测试,以确保它通过适当地设置属性或者通过发布其他消息来适当地响应。我正在使用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)
{
   . . .
}

模块B构造函数的调用如下:

ModuleB(IEventAggregator EventAggregator)

这个构造函数由Prism框架调用。对于单元测试,我需要创建一个ModuleB实例,并传递一个IEventAggregator,可能是一个由Moq创建的假的。我想以这样的方式做到这一点,即我发布的消息带有importantString。 如果我谷歌这句话“用moq和事件聚合进行单元测试”,那就有 几个引用,但我没有看到如何使用任何这些方法将“importantString”从ModuleA传递给ModuleB。 Prism 5的示例代码创建了一个假事件聚合器,但没有使用Moq。我不明白它是如何工作的,也不知道如何传递一个字符串。

我的测试代码开头是这样的:

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

我见过的一些引用类似于.Returns(eventBeingListenedTo.Object); 应用安装程序后moqEventAggregator。 我显然需要将.Setup(某些东西)应用到moqImportantMessage以传递importantString,但我还没有看到到底是什么。

我错过了什么?如何使用伪造的已发布消息传递字符串?

1 个答案:

答案 0 :(得分:0)

基本上你需要在这里模拟两件事:

  1. 事件聚合器
  2. 活动本身
  3. 鉴于你有嘲笑你需要做的事件,如你所说:

    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");