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