c# - Cómo agregar un artículo a un DbSet simulado(usando Moq)
linq (1)
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<T>())).Callback<T>((s) => sourceList.Add(s));
Código completo
private static DbSet<T> GetQueryableMockDbSet<T>(List<T> sourceList) where T : class
{
var queryable = sourceList.AsQueryable();
var dbSet = new Mock<DbSet<T>>();
dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
dbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
dbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
dbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator());
dbSet.Setup(d => d.Add(It.IsAny<T>())).Callback<T>((s) => sourceList.Add(s));
return dbSet.Object;
}
Salida
hello debug
preCount = 3 postCount = 4
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<string> stringList = new List<string>
{
"a", "b", "c"
};
DbSet<string> myDbSet = GetQueryableMockDbSet(stringList);
int preCount = myDbSet.Count();
myDbSet.Add("d");
int postCount = myDbSet.Count();
Debug.WriteLine("preCount = " + preCount + " postCount = " + postCount);
}
private static DbSet<T> GetQueryableMockDbSet<T>(List<T> sourceList) where T : class
{
var queryable = sourceList.AsQueryable();
var dbSet = new Mock<DbSet<T>>();
dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
dbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
dbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
dbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator());
return dbSet.Object;
}