J'essaie de configurer un faux DbSet à des fins de test. J'ai utilisé le didacticiel ici, http://www.loganfranken.com/blog/517/mocking-dbset-queries-in-ef6/ et l'ai légèrement modifié, donc appeler GetEnumerator renvoie un nouvel énumérateur à chaque fois (un autre problème que j'avais). Cependant, j'ai du mal à ajouter des éléments au DbSet.
Le résultat est preCount = 3 postCount = 3. Cependant, je m'attends à ce qu'il soit precount = 3 postCount = 4. Toute aide est grandement appréciée.
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;
}
myDbSet
n'est pas une implémentation réelle de DbSet
mais une maquette qui signifie fake et doit être configurée pour toutes les méthodes dont vous avez besoin. Le Add
ne fait pas exception, il doit donc être configuré pour faire ce dont vous avez besoin, sinon il ne fait rien.
Ajoutez quelque chose comme ce qui suit et lorsque la myDbSet.Add("d");
est appelée, le "d" est ajouté à la liste et peut être renvoyé plus tard.
dbSet.Setup(d => d.Add(It.IsAny<T>())).Callback<T>((s) => sourceList.Add(s));
Code complet
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;
}
Sortie
hello debug
preCount = 3 postCount = 4