2016-03-25 10 views
0

エンティティフレームワーク用の模擬DBContextを構築するいくつかのテストヘルパメソッドを構築しました。これらのメソッドには重複したコードが含まれており、これを行うにはより良い方法が必要であると仮定しています。私はどのように考え出すことができません。私はMockDbContextBuilder <クラスを作成しようとしましたが、DbSet <を持つことができなかったので失敗しました。何か案は?ここで私は一つにリファクタリングしようとしている方法の3つの例は以下のとおりです。種類によって異なる重複コードのリファクタリング

private Mock<IPSNContext> BuildMockDbContext(List<TestEntity> list) 
    { 
     _mockDbSet = new Mock<DbSet<TestEntity>>(); 
     _mockDbSet.As<IQueryable<TestEntity>>().Setup(m => m.Provider).Returns(list.AsQueryable().Provider); 
     _mockDbSet.As<IQueryable<TestEntity>>().Setup(m => m.Expression).Returns(list.AsQueryable().Expression); 
     _mockDbSet.As<IQueryable<TestEntity>>().Setup(m => m.ElementType).Returns(list.AsQueryable().ElementType); 
     _mockDbSet.As<IQueryable<TestEntity>>().Setup(m => m.GetEnumerator()).Returns(list.AsQueryable().GetEnumerator()); 

     foreach (var item in list) 
     { 
      _mockDbSet.Setup(m => m.Find(item.Id)).Returns(item); 
     } 

     var mockContext = new Mock<IPSNContext>(); 
     mockContext.Setup(c => c.Set<TestEntity>()) 
        .Returns(_mockDbSet.Object); 
     return mockContext; 
    } 

    private Mock<IPSNContext> BuildMockDbContext(List<MessageBoardTopic> list) 
    { 
     _mockDbSet = new Mock<DbSet<MessageBoardTopic>>(); 
     _mockDbSet.As<IQueryable<MessageBoardTopic>>().Setup(m => m.Provider).Returns(list.AsQueryable().Provider); 
     _mockDbSet.As<IQueryable<MessageBoardTopic>>().Setup(m => m.Expression).Returns(list.AsQueryable().Expression); 
     _mockDbSet.As<IQueryable<MessageBoardTopic>>().Setup(m => m.ElementType).Returns(list.AsQueryable().ElementType); 
     _mockDbSet.As<IQueryable<MessageBoardTopic>>().Setup(m => m.GetEnumerator()).Returns(list.AsQueryable().GetEnumerator()); 

     foreach (var item in list) 
     { 
      _mockDbSet.Setup(m => m.Find(item.Id)).Returns(item); 
     } 

     var mockContext = new Mock<IPSNContext>(); 
     mockContext.Setup(c => c.Set<MessageBoardTopic>()) 
        .Returns(_mockDbSet.Object);   
     return mockContext; 
    } 

    private Mock<IPSNContext> BuildMockDbContext(List<MessageBoardReply> list) 
    { 
     _mockDbSet = new Mock<DbSet<MessageBoardReply>>(); 
     _mockDbSet.As<IQueryable<MessageBoardReply>>().Setup(m => m.Provider).Returns(list.AsQueryable().Provider); 
     _mockDbSet.As<IQueryable<MessageBoardReply>>().Setup(m => m.Expression).Returns(list.AsQueryable().Expression); 
     _mockDbSet.As<IQueryable<MessageBoardReply>>().Setup(m => m.ElementType).Returns(list.AsQueryable().ElementType); 
     _mockDbSet.As<IQueryable<MessageBoardReply>>().Setup(m => m.GetEnumerator()).Returns(list.AsQueryable().GetEnumerator()); 

     foreach (var item in list) 
     { 
      _mockDbSet.Setup(m => m.Find(item.Id)).Returns(item); 
     } 

     var mockContext = new Mock<IPSNContext>(); 
     mockContext.Setup(c => c.Set<MessageBoardReply>()) 
        .Returns(_mockDbSet.Object); 
     return mockContext; 
    } 

答えて

2

あなたがそのように、ジェネリック型とメソッドを持つことができます。

private Mock<IPSNContext> BuildMockDbContext<T>(List<T> list) 
    { 
       _mockDbSet = new Mock<DbSet<T>>(); 
       _mockDbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(list.AsQueryable().Provider); 
       _mockDbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(list.AsQueryable().Expression); 
       _mockDbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(list.AsQueryable().ElementType); 
       _mockDbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(list.AsQueryable().GetEnumerator()); 

       foreach (var item in list)    
        _mockDbSet.Setup(m => m.Find(item.Id)).Returns(item);    

       var mockContext = new Mock<IPSNContext>(); 
       mockContext.Setup(c => c.Set<MessageBoardTopic>()) 
          .Returns(_mockDbSet.Object); 

       return mockContext; 
    } 
+1

を、これは働いていました。ありがとう。 DbSet はTがクラスであることを期待しているため、 プライベートモックを追加する必要がありました BuildMockDbContext (List )** TEntity:class、new()** – drewob

関連する問題