Подтвердить что ты не робот

Как добавить элемент в 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<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;
    }
4b9b3361

Ответ 1

myDbSet - не реальная реализация DbSet, а макет, что означает, что он подделка, и его необходимо настроить для всех необходимых вам методов. Add не является исключением, поэтому его нужно настроить, чтобы делать то, что вам нужно, иначе он ничего не делает.

Добавьте что-то вроде следующего, и когда вызывается myDbSet.Add("d");, тогда "d" добавляется в список и может быть возвращен позже.

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

Полный код

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

Выход

hello debug
preCount = 3 postCount = 4