Как реализовать метод Count на объекте Mocked IQueryable - PullRequest
0 голосов
/ 16 января 2019

В настоящее время я создаю DbSet, используя:

//Helper Function in another file
public static DbSet<T> MockDbSet<T>(params T[] items) where T : class
            {
                IEnumerable<T> ts = items;
                var mock = new Mock<DbSet<T>>();
                mock.As<IQueryable<T>>().Setup(x => x.GetEnumerator()).Returns(ts.GetEnumerator());
                return mock.Object;
            }

И я звоню, используя:

Answer[] sampleAnswers = new Answer[]
                {
                    new Answer() { Id = 4, QuestionId = 1, SurveyId = 4 },
                    new Answer() { Id = 5, QuestionId = 2, SurveyId = 4 },
                    new Answer() { Id = 6, QuestionId = 3, SurveyId = 4 },
                    new Answer() { Id = 7, QuestionId = 4, SurveyId = 5 }
                };

var mockAnswers = Helper.MockDbSet(sampleAnswers);

context.Setup(c => c.Answers).Returns(mockAnswers);
var count = context.Object.Answers.Count();

Когда я попадаю в context.Object.Answers.Count (), я получаю исключение нулевого указателя. Тем не менее, когда я запускаю foreach для context.Object.Answers, я могу получить каждый ответ в порядке. Мне чего-то не хватает, что мне надо издеваться? Я знаю, что не могу издеваться над методами расширения.

1 Ответ

0 голосов
/ 16 января 2019

Ответ Службы был верным. Мне нужно было изменить свой общий набор DbSet на следующий, и подсчет сработал:

 public static DbSet<T> MockDbSet<T>(params T[] items) where T : class
    {
        IEnumerable<T> ts = items;
        var mock = new Mock<DbSet<T>>();
        mock.As<IQueryable<T>>().Setup(x => x.GetEnumerator()).Returns(ts.GetEnumerator());
        mock.As<IQueryable<T>>().Setup(x => x.Provider).Returns(items.AsQueryable().Provider);
        mock.As<IQueryable<T>>().Setup(x => x.Expression).Returns(items.AsQueryable().Expression);
        mock.As<IQueryable<T>>().Setup(x => x.ElementType).Returns(items.AsQueryable().ElementType);

        return mock.Object;
    }
...