Новичок пытается использовать Moq для перечислимого метода

Я пытаюсь понять, нравится ли Moq тому, что я хотел бы использовать в новом проекте, поскольку другие издевательские рамки, которые я использовал, бросают вызов IMHO. Так, например, у меня есть метод как таковой:

IEnumerable<PickList> GetPickLists();

Я не уверен, как я должен издеваться над этим... Я пробовал что-то вроде этого, но у меня возникают ошибки сложения (я знаю следующее Возвращает() неверно, но не может понять, что положить в тело Returns:

var mockCrm = new Mock<ICrmProvider>();
mockCrm.Setup<IEnumerable<PickList>>(foo => foo.GetPickLists())
              .Returns<IEnumerable<PickList>>({});

Кроме того, пытаясь сделать что-то вроде этих двух методов:

CustomerSyncResult ApplyActions(IEnumerable<CustomerAction> actions);
IEnumerable<Customer> GetCustomers(IEnumerable<string> crmIDs, IEnumerable<string> emails);

Я знаю, что задаю полный вопрос, но у меня есть время начать. CHM в загрузке не имеет достаточного количества образцов для меня, и некоторые из обучающих программ там, кажется, используют устаревшие методы, а также не покрывают перечисления, что делает его сложным для меня: (

Приветствуются любые советы.

Ответ 1

Try

mockCrm.Setup(x => x.GetPickLists())
    .Returns(new List<PickList>());

QuickStart является хорошей ссылкой.

Некоторые примеры для других методов:

mockCrm.Setup(x => x.ApplyActions(It.IsAny<IEnumerable>()))
    .Returns(new CustomerSyncResult());

mockCrm.Setup(x => x.GetCustomers(It.IsAny<IEnumerable>(),
                                  It.IsAny<IEnumerable>()))
    .Returns(new List<Customers>());

В качестве альтернативы создайте общий ресурс IEnumerable в вашем исходном интерфейсе для лучшей безопасности типов.

Вы также можете использовать новые функциональные спецификации Moq v4:

var list = new List<PickList> { new PickList() };

ICrmProvider crm =
    Mock.Of<ICrmProvider>(
        x =>
        x.GetPickLists() == list);

Это не так хорошо документировано в настоящее время. Обратите внимание, что вам больше не нужно писать mock.Object. Некоторые ссылки:

Точный синтаксис (использование It.Is, содержимое списков и т.д.) будет зависеть от того, что вы пытаетесь выполнить. It.IsAny будет соответствовать любому аргументу, что упростит работу с параметрами последовательности или коллекции.