2015-09-25 56 views
1

我一定要考的是處理特定的事件,並堅持它只讀Mongo的數據庫上的投影(我使用的是官方的C#蒙戈驅動程序):單元測試時,成員隱藏

public class MyObjectProjection : IHandleMessages<RegisteredEvent> 
{ 
    private MongoCollection<MyObjectView> _collection; 
    private MyObjectView item; 

    public MyObjectProjection (MongoDatabase db) 
    { 
     _collection = db.GetCollection<MyObjectView>("my-object"); 
    } 

    public void Handle(RegisteredEvent message) 
    { 
     item = new MyObjectView(); 
     item.Id = message.Id; 

     // some code omitted     

     _collection.Save(item); 
    } 
} 

我需要單元測試Handle方法,因爲:

  • 我不想進行集成測試。數據庫和收集被嘲笑,所以保存不實
  • 我只是想測試的項目的消息映射
  • 成員是隱藏的,我不想讓他們更多的分享範圍

我應該使用替代解決方案而不是反射或友好裝配嗎?這種情況下的最佳做法是什麼? 現在我的測試是這樣的:

[TestMethod] 
    public void TestMethod1() 
    { 
     // ARRANGE - some code omitted 
     databaseMock 
      .Setup(x => x.GetCollection<MyObjectView>(It.IsAny<string>())) 
      .Returns(collection); 

     collectionMock 
      .Setup(x => x.Save(It.IsAny<MyObjectView>())) 
      .Returns(It.IsAny<WriteConcernResult>); 

     // ACT 
     var handler = new MyObjectProjection(database); 
     handler.Handle(evt); 

     // ASSERT 
     // nothin' to assert here! 
    } 

這個工作,但我沒有什麼時候完成Handle方法斷言。

回答

0

這種情況下的最佳做法是什麼?

最佳做法是使成員可見。您有什麼特別的理由需要隱藏會員嗎?

然後,您可以斷言對傳遞給Save方法參數:

MyObjectView objectView; 

    collectionMock 
     .Setup(x => x.Save(It.IsAny<MyObjectView>())) 
     .Callback<MyObjectView>((obj) => objectView= obj) 
     .Returns(It.IsAny<WriteConcernResult>); 

    Assert.That(objectView.Id, Is.EqualTo(evt.Id)); 
    //assert other properties 
+0

我寧願儘可能地限制自己,而且我真的不喜歡爲了可測試性而增加可視性的想法。我想要的就是這個,通過模擬測試。 –

0

那麼,您的Handle()方法通過調用Save()方法與集合進行交互。因此,你可以期望傳遞給handle方法,該元素具有正確的ID集:

collectionMock.Verify(x=>x.Save(It.Is<MyObjectView>(v => v.Id == 5)), Times.Once,"save should be called with object with Id = 5"); 

我這裏假設傳遞到Handle()evt有和5碼的編號沒有測試過,但我認爲像這會做的伎倆。

+0

ID是我手動映射的唯一領域,其他均爲AutoMapper的東西,我覺得不舒服明知只有測試過的東西是我比其他人更信任的東西:) –