我需要一些关于如何在单元测试中使用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?
无论如何,不知道如何设置任何这样的任何建议将不胜感激.
您将为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的行为正确.