2011-10-23 70 views
2

Moq和嘲笑的新特點。測試一個具有通用RepositoryFactory的類,並使用它的幾個存儲庫。我應該像這樣初始化還是有更好的方法?正確嘲諷通用方法

Mock<IRepositoryFactory> factory; 
     Mock<IRepository<User>> userRepository; 
     Mock<IRepository<Role>> roleRepository; 
     Mock<IRepository<Meeting>> meetingRepository; 

     [TestInitialize()] 
     public void MyTestInitialize() 
     { 
      meetingRepository = new Mock<IRepository<Meeting>>(); 
      //some meeting setup 

      userRepository = new Mock<IRepository<User>>(); 
      //some user setup 

      roleRepository = new Mock<IRepository<Role>>(); 
      //some role setup 

      factory = new Mock<IRepositoryFactory>(); 
      factory.Setup(f => f.CreateRepository<Meeting>()).Returns(meetingRepository.Object); 
      factory.Setup(f => f.CreateRepository<User>()).Returns(userRepository.Object); 
      factory.Setup(f => f.CreateRepository<Role>()).Returns(roleRepository.Object); 

請注意,我可以更多。

這裏我正在做這一切在我的初始化方法,但我猜我應該單獨做或別的什麼。

回答

2

我不知道如何設置f => f.CreateRepository<T>(),因爲您的存儲庫設置可能會因爲每個T而不同。除此之外,您可以使用功能規格(請參閱此blog post),它使事情變得更清潔。

對於你的榜樣,它應該是這樣的:

var factory = Mock.Of<IRepositoryFactory>(
    x => 
    x.CreateRepository<Meeting>() == Mock.Of<IRepository<Meeting>>() && 
    x.CreateRepository<Role>() == Mock.Of<IRepository<Role>>() && 
    x.CreateRepository<User>() == Mock.Of<IRepository<User>>() 
    ); 
1

從技術上講,我沒有看到你的代碼有問題。

然而,你甚至沒有開始在你想測試的課程上工作,並且已經有4次模擬,並且「可能有更多」,這有點令人擔憂。這聽起來像是非常多的設置。最重要的是,如果我對[TestInitialize]的理解是正確的,這意味着對於這個類中的每個測試,每個存儲庫都將以相同的方式進行設置。這可能會妨礙用不同條件指定測試。

也許您應該考慮避免[TestInitialize],並在每種測試方法中設置所需的存儲庫,特定於您想要聲明的內容 - 逐步將每個存儲庫的設置提取爲共享方法,遵循BDD風格: 「Given_User_Of_Type_VIP()」返回一個存儲庫,其類型爲VIP安裝程序的用戶。

+0

那麼我可以有更多的原因是,這是一個WCF服務類,實現了幾個服務合同,我目前不使用TDD。該服務只有一個RepositoryFactory類,但我必須模擬它可能返回的存儲庫。 –