Не удалось проверить метод, вызванный внутри Select () с использованием Moq framework - PullRequest
0 голосов
/ 16 мая 2018

У меня проблема с проверкой того, что какой-то метод вызывался при имитации внутри запроса LINQ Select ().

Вот метод ContentManager, который я хочу протестировать:

public string ProcessElements(List<Item> items)
{
    var processed = items.Select(item => item.Process(Constants.Text));

    return Serialize(processed);
}

Iхочу проверить, что Process () вызывается для элементов списка.Мой метод теста выглядит следующим образом:

[TestMethod]
public void ProcessItems_ValidItems_ProcessCalled()
{
    var contentManager = new ContentManager();
    var itemMock = new Mock<Item>();
    itemMock.Setup(m => m.Process(It.IsAny<string>()))
        .Returns("serialized");

    contentManager.ProcessElements(new List<Item>() { itemMock.Object });

    itemMock.Verify(m => m.Process(It.IsAny<string>()), Times.Once());
}

Когда я запускаю этот тест, он не проходит и возвращает следующее сообщение:

Метод теста ProcessItems_ValidItems_ProcessCalled выбросил исключение:

Moq.MockException:

Ожидаемый вызов для макета хотя бы один раз, но никогда не выполнялся:

m => m.Process (It.IsAny ())

Нетнастройки настроены.

Не выполнено ни одного вызова.

Но если я изменю Select () на foreach, тогда тест проходит успешно:

public string ProcessElements(List<Item> iitem)
{
    var processed = new List<string>();
    foreach (var item in iitem)
    {
        processed.Add(item.Process(Constants.Text));
    }

    return Serialize(processed);
}

Что не так с Moq + Select ()?Как я могу это исправить?

1 Ответ

0 голосов
/ 16 мая 2018

Не уверен, что метод .Serialize делает, но .Select не выполняет фактический запрос, он возвращает только объект, который знает, как перебрать IEnumerable<T>.

С помощью нескольких методов LINQ, таких как .Where, .Select, вы можете создать запрос, который позже будет лениво повторяться, обычно foreach или вызовом .ToList, .ToDictionary и т. Д.

Чтобы запустить запрос LINQ, измените его с:

.Select(...)

TO:

.Select(...).ToList()

...