Макет IList.Добавить с помощью Moq - PullRequest
3 голосов
/ 21 апреля 2019

Я пытаюсь настроить объект moq для запуска некоторых модульных тестов на объекте бизнес-уровня, который использует EF6.До сих пор я мог тестировать вызовы простых методов и проверять, были ли вызваны эти методы.Но есть ли способ проверить, действительно ли объект был вставлен в базовую коллекцию.

Это мой метод подделки

private Mock<DbSet<T>> CreateMockDbSet<T>(IQueryable<T> entities) where T : class
{
    var mockSet = new Mock<DbSet<T>>();
    mockSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(entities.Provider);
    mockSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(entities.Expression);
    mockSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(entities.ElementType);
    mockSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(entities.GetEnumerator());
    IList<T> list = entities as IList<T>;
    mockSet.As<IList<T>>().Setup(m => m.Add(It.IsAny<T>())).Returns(list.Add(It.IsAny<T>()));
    mockSet.Setup(m => m.Include(It.IsAny<string>())).Returns(mockSet.Object);
    return mockSet;
}

Я пытаюсь смоделировать фактическую AddМетод из списка, но, как написано выше, говорит, что нет метода .Return.

Возможно ли это вообще?

Мне нужно проверить, был ли объект вставлен в мою коллекцию макетов после некоторой логики.

1 Ответ

3 голосов
/ 21 апреля 2019

IList.Add метод возвращает void, поэтому вы не можете настроить return, вместо этого используйте .Callback

mockSet.As<IList<T>>()
    .Setup(m => m.Add(It.IsAny<T>()))
    .Callback<T>(item => list.Add(item));

или используйте Capture.In

mockSet.As<IList<T>>()
    .Setup(m => m.Add(Capture.In(list)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...