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为例
- C#:重定向已经运行的进程的标准输出
- Unity 2d游戏中奇怪的碰撞错误
- 开始使用BouncyCastle加密dll c#
- 控制器错误“Microsoft.AspNetCore.Mvc.Rendering.SelectListItem”中的MVC Core SelectList下拉列表
- ModelState无效时保留下拉信息
- C#将RSACryptoServiceProvider中的私有/公共RSA密钥导出为PEM字符串
- 如何通过Printername和JobID暂停Win32_printJob
- 当存在非静态,更合适的方法时,如何使用动态参数调用静态方法?
- Resharper:无法在VS2010 SP1中解析符号’Eval’