2010-09-12 139 views
3

想知道如果可能的起訂量棱鏡EventAggregator 讓我們以EventAggregator快速入門他們起訂量事件聚合器可以

 [TestMethod] 
     public void PresenterPublishesFundAddedOnViewAddClick() 
     { 
     var view = new MockAddFundView(); 
     var EventAggregator = new MockEventAggregator(); 
     var mockFundAddedEvent = new MockFundAddedEvent(); 
     EventAggregator.AddMapping<FundAddedEvent>(mockFundAddedEvent); 
     var presenter = new AddFundPresenter(EventAggregator); 
     presenter.View = view; 
     view.Customer = "99"; 
     view.Fund = "TestFund"; 
     view.PublishAddClick(); 
     Assert.IsTrue(mockFundAddedEvent.PublishCalled); 
     Assert.AreEqual("99", mockFundAddedEvent.PublishArgumentPayload.CustomerId); 
     }  

    I have tried to convert the above using moq but I get problems 

他們MockEventAggregator.How我能做到這起訂量使用?

public class MockEventAggregator : IEventAggregator 
{ 
    Dictionary<Type, object> events = new Dictionary<Type, object>(); 
    public TEventType GetEvent<TEventType>() where TEventType : EventBase 
    { 
     return (TEventType)events[typeof(TEventType)]; 
    } 

    public void AddMapping<TEventType>(TEventType mockEvent) 
    { 
     events.Add(typeof(TEventType), mockEvent); 
    } 
} 

有沒有人使用最小起訂量和EventAggregator是否有任何例子呢? 非常感謝

編輯

繼GrameF答案我已經加了我的代碼,仍然不能work.Can你幫

  [TestMethod] 
      public void PresenterPublishesFundAddedOnViewAddClick2() 
      { 

       //Arrange 
       var view = new Mock<IAddFundView>(); 
       var fakeEventAggregator = new Mock<IEventAggregator>(); 
       var fakeMyEvent = new Mock<FundAddedEvent>(); 
       fakeEventAggregator.Setup(x => x.GetEvent<FundAddedEvent>()).Returns(fakeMyEvent.Object); 

       var presenter = new AddFundPresenter(fakeEventAggregator.Object) {View = view.Object}; 
       fakeMyEvent.Verify(x => x.Publish(It.IsAny<FundOrder>())); **//CRASHES** HERE 



       //view.PublishAddClick(); 
       //view.Customer = "99"; 
       //view.Fund = "TestFund"; 

       //view.PublishAddClick(); 

       ////Assert 
       //Assert.IsTrue(mockFundAddedEvent.PublishCalled); 
       //Assert.AreEqual("99", mockFundAddedEvent.PublishArgumentPayload.CustomerId); 
       //Assert.AreEqual("TestFund", mockFundAddedEvent.PublishArgumentPayload.TickerSymbol); 
      } 

回答

12

是的,這是可能的,你只需要設置它回報,你可以驗證PublishSubscribe被稱爲模擬事件:

var fakeEventAggregator = new Mock<IEventAggregator>(); 
var fakeMyEvent = new Mock<MyEvent>(); 

fakeEventAggregator. 
    Setup(x => x.GetEvent<MyEvent>()). 
    Returns(fakeMyEvent.Object); 

var test = new Foo(fakeEventAggregator.Object); 
test.PublishAnEvent(); 

fakeMyEvent.Verify(x => x.Publish(It.IsAny<MyEventArgs>())); 
+0

優秀,幾乎there.Would它過多,以幫助創建第一個,然後我可以從那裏拿走它。我已經嘗試過你的實現,但在做一個等效的test.PublishAnEvent()時卡住了; //似乎無法發佈event,因爲我看不到 presenter.View ????? //似乎無法發佈event,因爲我看不到 presenter.View ????? – user9969 2010-09-12 10:43:53

+0

var view = new Mock (); var fakeEventAggregator = new Mock (); var fakeMyEvent = new Mock (); fakeEventAggregator.Setup(x => x.GetEvent ())。Returns(fakeMyEvent.Object); var presenter = new AddFundPresenter(fakeEventAggregator.Object); //似乎無法發佈event,因爲我看不到 presenter.View ????? – user9969 2010-09-12 10:45:51

+0

你不應該需要視圖才能測試這個;應該有一個方法或由Presenter公開的'ICommand'或屬性(或其他),這會導致該事件被髮布 - 這是我的示例中的PublishAnEvent方法。 – GraemeF 2010-09-12 12:17:51