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?还是属于 SomeService 单元测试而不是 SomeClass 的单独单元测试?

无论如何,不​​知道如何设置任何这些,所以任何建议都将不胜感激。

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 回答