Cómo agregar un artículo a un DbSet simulado (usando Moq)

Estoy tratando de configurar un DbSet simulado para propósitos de prueba. Utilicé el tutorial aquí, http://www.loganfranken.com/blog/517/mocking-dbset-queries-in-ef6/ y lo modifiqué ligeramente, de modo que llamar a GetEnumerator devuelve un nuevo enumerador cada vez (otro problema que estaba teniendo) . Sin embargo, estoy teniendo dificultades para agregar elementos al DbSet.

La salida es preCount = 3 postCount = 3. Sin embargo, espero que sea precount = 3 postCount = 4. Cualquier ayuda es muy apreciada.

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 no es una implementación real de DbSet sino un simulacro, lo que significa que es falso y debe configurarse para todos los métodos que necesite. Add no es una excepción, por lo que debe configurarse para hacer lo que necesita, de lo contrario no hace nada.

Agregue algo como lo siguiente y cuando el myDbSet.Add("d"); se llama, luego se agrega la ‘d’ a la lista y se puede devolver más tarde.

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

Código completo

 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; } 

Salida

 hello debug preCount = 3 postCount = 4