我想通过事件聚合向它发送消息来对模块进行单元测试,以确保它通过适当地设置属性或者通过发布其他消息来适当地响应。我正在使用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,但我还没有看到到底是什么。
我错过了什么?如何使用伪造的已发布消息传递字符串?
答案 0 :(得分:0)
基本上你需要在这里模拟两件事:
鉴于你有嘲笑你需要做的事件,如你所说:
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");