【问题标题】:Mocking Prism Event Aggregator using Moq for Unit Testing使用 Moq 进行单元测试的 Mocking Prism 事件聚合器
【发布时间】:2011-03-23 19:24:53
【问题描述】:

我需要一些关于如何在单元测试中使用 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 的单独单元测试?

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

【问题讨论】:

    标签: unit-testing nunit mocking moq eventaggregator


    【解决方案1】:

    您将为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 在处理一个事件时行为是否正确。

    【讨论】:

    • 本示例使用“构造函数依赖注入”,因为对 IEventAggregator 的依赖是在 SomeClass 构造函数期间注入的。
    • 很好的答案,这对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多