我需要一些关于如何在单元测试中使用Moq的建议,以确保我所测试的课程表现得如何。那就是被测试的类发布了一个Event Aggregator(来自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?
无论如何,不知道如何设置任何这些,所以任何建议都会受到赞赏。
答案 0 :(得分:9)
您将为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
在给定要处理的事件时表现正常。