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

1 ответов


myDbSet не является реальной реализацией DbSet но макет, который означает, что это подделка и он должен быть настроен для всех методов, которые вам нужны. The 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