如何将项添加到Mock DbSet(使用Moq)

我正在尝试设置一个模拟DbSet用于测试目的。 我在这里使用了这个教程, http://www.loganfranken.com/blog/517/mocking-dbset-queries-in-ef6/并略微修改它,所以每次调用GetEnumerator都会返回一个新的枚举器(我遇到的另一个问题) 。 但是,我在向DbSet添加项目时遇到困难。

输出是preCount = 3 postCount = 3.但是,我希望它是precount = 3 postCount = 4.非常感谢任何帮助。

static void Main(string[] args) { Debug.WriteLine("hello debug"); List stringList = new List { "a", "b", "c" }; DbSet myDbSet = GetQueryableMockDbSet(stringList); int preCount = myDbSet.Count(); myDbSet.Add("d"); int postCount = myDbSet.Count(); Debug.WriteLine("preCount = " + preCount + " postCount = " + postCount); } private static DbSet GetQueryableMockDbSet(List sourceList) where T : class { var queryable = sourceList.AsQueryable(); var dbSet = new Mock<DbSet>(); dbSet.As<IQueryable>().Setup(m => m.Provider).Returns(queryable.Provider); dbSet.As<IQueryable>().Setup(m => m.Expression).Returns(queryable.Expression); dbSet.As<IQueryable>().Setup(m => m.ElementType).Returns(queryable.ElementType); dbSet.As<IQueryable>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator()); return dbSet.Object; } 

myDbSet不是myDbSet的真正实现,而是一个模拟,这意味着它是假的 ,需要为你需要的所有方法设置它。 Add不是例外,因此需要将其设置为执行您需要的操作,否则它不会执行任何操作。

添加如下内容和myDbSet.Add("d"); 然后调用’d’添加到列表中,稍后可以返回。

 dbSet.Setup(d => d.Add(It.IsAny())).Callback((s) => sourceList.Add(s)); 

完整的代码

 private static DbSet GetQueryableMockDbSet(List sourceList) where T : class { var queryable = sourceList.AsQueryable(); var dbSet = new Mock>(); dbSet.As>().Setup(m => m.Provider).Returns(queryable.Provider); dbSet.As>().Setup(m => m.Expression).Returns(queryable.Expression); dbSet.As>().Setup(m => m.ElementType).Returns(queryable.ElementType); dbSet.As>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator()); dbSet.Setup(d => d.Add(It.IsAny())).Callback((s) => sourceList.Add(s)); return dbSet.Object; } 

产量

 hello debug preCount = 3 postCount = 4