2010-08-01 89 views
5

我需要一些关于如何在单元测试中使用Moq的建议,以确保我的课程能够以我想要的方式运行。这是被测试的课程发布了一个Event Aggregator(来自Prism)事件,我需要某种方式来断言这个事件在我的测试中已经提出。使用Moq进行单元测试的嘲讽Prism Event Aggregator

我在工作中没有太多的资源,并且发现很难知道如何设置它。

我: -

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的单​​独单元测试?

无论如何,不​​知道如何设置任何这个,所以任何意见将不胜感激。

回答

8

你会提供SomeClassIEventAggregator,这将允许您在测试过程中提供一个模拟:

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在给定要处理的事件时的行为正确。

+0

本示例使用“构造函数依赖注入”,因为在SomeClass构造函数期间注入对IEventAggregator的依赖。 – 2010-11-12 13:50:16

+0

很好的答案,这帮了我很多。 – user630190 2012-03-20 13:15:31