web-dev-qa-db-fra.com

Comment ajouter un élément à un Mock DbSet (en utilisant Moq)

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

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
98
dee