NSubstitute vs PRISM EventAggregator:断言调用方法会触发具有正确有效负载的事件

考虑以下方法,通过PRISM EventAggregator更新人员并发布事件,以指示此人已更新。

我想unit testing消息是否与正确的有效负载一起发送。 在这种情况下,这意味着正确的personId。

public void UpdatePerson(int personId) { // Do whatever it takes to update the person // ... // Publish a message indicating that the person has been updated _eventAggregator .GetEvent() .Publish(new PersonUpdatedEventArgs { Info = new PersonInfo { Id = personId, UpdatedAt = DateTime.Now }; }); } 

我知道我可以创建事件聚合器的替代品:

 var _eventAggregator = Substitute.For(); 

但是,我不知道如何检测何时发送消息以及如何检查其有效负载。

我不是一个经验丰富的unit testing人员,所以我不确定这是正确的unit testing。 但无论如何,这是我到目前为止测试它的方式,它似乎做了我想要的。

 [Test] public void TestPersonUpdateSendsEventWithCorrectPayload() { // ARRANGE PersonUpdatedEventArgs payload = null; _eventAggregator .GetEvent() .Subscribe(message => payload = message); // ACT _personService.UpdatePerson(5); // ASSERT payload.Should().NotBeNull(); payload.Id.Should().Be(5); } 

欢迎反馈。

您实际上可以像这样替换事件聚合器:

 public class ToBeTested { private readonly IEventAggregator _eventAggregator; public ToBeTested( IEventAggregator eventAggregator ) { _eventAggregator = eventAggregator; } public void DoStuff() { _eventAggregator.GetEvent().Publish( "test" ); } } public class OneEvent : PubSubEvent { } [TestFixture] internal class Test { [Test] public void DoStuffTest() { var myEvent = new MyOneEvent(); var myEventAggregator = Substitute.For(); myEventAggregator.GetEvent().Returns( myEvent ); var toBeTested = new ToBeTested( myEventAggregator ); toBeTested.DoStuff(); Assert.That( myEvent.ReceivedPayload, Is.EqualTo( "test" ) ); } private class MyOneEvent : OneEvent { public override void Publish( string payload ) { ReceivedPayload = payload; } public string ReceivedPayload { get; private set; } } } 

请注意在被测试主题上强制使用的虚假事件类,以获取对有效负载的访问权限。

只需将订户添加到您的unit testing并检查委托的结果。 以Prism的IEventAggregatorunit testing为例

https://github.com/PrismLibrary/Prism/blob/master/Source/Prism.Tests/Events/PubSubEventFixture.cs#L14