2011-10-23 69 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类,但我必须模拟它可能返回的存储库。 –