2016-03-08 16 views
2

請考慮下面的方法來更新人員並通過PRISM EventAggregator發佈事件以指示人員已更新。NSubstitute與PRISM EventAggregator:斷言調用方法觸發具有正確有效負載的事件

我想單元測試消息與正確的有效負載一起發送。在這種情況下,這將意味着正確的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<PersonUpdatedEvent>() 
     .Publish(new PersonUpdatedEventArgs 
     { 
      Info = new PersonInfo 
      { 
       Id = personId, 
       UpdatedAt = DateTime.Now 
      }; 
     }); 
} 

我知道我可以爲事件創建聚合的替代品:

var _eventAggregator = Substitute.For<IEventAggregator>(); 

不過,我不知道如何當發送消息以及如何檢查它的有效載荷探測。

+0

做什麼?如果不是這樣,我建議你假設它可以工作,並且在測試視圖模型或其他時使用它。代替'IEventAggregator'並不會幫助你測試EventAggregator'實現,不管怎樣:-) BTW - Prism帶有一組很好的測試,包括事件在這裏https://github.com/PrismLibrary/Prism/tree /master/Source/Prism.Tests/Events – Haukinger

+0

但是,如果您想測試是否使用正確的值創建PersonUpdatedEventArgs,則可能不需要此處的事件聚合器,請檢查生成的實例(並且相信Prism實際發佈事件)... – Haukinger

+0

如何發佈你現在的單元測試 –

回答

0

我不是一個有經驗的單元測試人員,所以我不確定這是寫出正確的單元測試。但無論如何,這是我迄今爲止的測試方式,它似乎按照我的要求進行測試。

[Test] 
public void TestPersonUpdateSendsEventWithCorrectPayload() 
{ 
    // ARRANGE 
    PersonUpdatedEventArgs payload = null; 
    _eventAggregator 
     .GetEvent<PersonUpdatedEvent>() 
     .Subscribe(message => payload = message); 

    // ACT 
    _personService.UpdatePerson(5); 

    // ASSERT 
    payload.Should().NotBeNull(); 
    payload.Id.Should().Be(5); 
} 

反饋歡迎。

1

實際上,你可以替換掉的事件聚合這樣的:

public class ToBeTested 
{ 
    private readonly IEventAggregator _eventAggregator; 

    public ToBeTested(IEventAggregator eventAggregator) 
    { 
     _eventAggregator = eventAggregator; 
    } 

    public void DoStuff() 
    { 
     _eventAggregator.GetEvent<OneEvent>().Publish("test"); 
    } 
} 

public class OneEvent : PubSubEvent<string> 
{ 
} 

[TestFixture] 
internal class Test 
{ 
    [Test] 
    public void DoStuffTest() 
    { 
     var myEvent = new MyOneEvent(); 
     var myEventAggregator = Substitute.For<IEventAggregator>(); 
     myEventAggregator.GetEvent<OneEvent>().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; 
     } 
    } 
} 

需要注意的是真實強加給被測對象以訪問有效載荷的假事件類。

相關問題