MOQ - Настройка и проверка обобщенного метода c с аргументом Fun c - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть сторонний интерфейс, который я хочу издеваться над его методами. Чтобы прояснить мою цель, рассмотрим следующий интерфейс IFoo, который имеет обобщенный метод c, такой как M2. Один из аргументов M2 имеет тип Fun c.

        public interface IFoo
        {
            bool M1<T>();
            bool M2<T>(T arg, Func<T, string> func);
        }

Если я настрою метод M2 следующим образом:

            var mock = new Mock<IFoo>();
            mock.Setup(foo => foo.M2(It.IsAny<It.IsAnyType>(),It.IsAny<Func<It.IsAnyType, string>>())).Returns(true);
            mock.Object.M2("arg1", s => s);
            mock.Verify(foo => foo.M2(It.IsAny<It.IsAnyType>(), It.IsAny<Func<It.IsAnyType, string>>()));

, проверка не будет выполнена. Но если он настроен и проверен с указанием типа c типа строки, то он работает:

            mock.Setup(foo => foo.M2(It.IsAny<string>(), It.IsAny<Func<string, string>>())).Returns(true);
            mock.Object.M2("arg1", s => s);
            mock.Verify(foo => foo.M2(It.IsAny<string>(), It.IsAny<Func<string, string>>()));

Проблема в том, что фактический тип T, передаваемый моему Mock, является внутренним классом, определенным в этом сторонняя библиотека. Поэтому я не могу настроить и проверить с указанным c типом, подобным вышеупомянутому.

Я что-то упустил в моей первой настройке или проверке, или это известная проблема, которая имеет еще не обращались? Я использую moq 4.13.1 и мой тестовый проект. Net Core 3.1

1 Ответ

0 голосов
/ 20 апреля 2020

Вместо

It.IsAny<Func<It.IsAnyType, string>>()

для параметра Func, попробуйте

(Func<It.IsAnyType, string>) It.IsAny<object>()

Рабочий пример:

var mock = new Mock<IFoo>();
mock.Setup(foo => foo.M2(It.IsAny<It.IsAnyType>(), (Func<It.IsAnyType, string>) It.IsAny<object>())).Returns(true);

mock.Object.M2("arg1", s => s);

mock.Verify(foo => foo.M2(It.IsAny<It.IsAnyType>(), (Func<It.IsAnyType, string>) It.IsAny<object>()));

Насколько мне известно, Moq isn не удалось сопоставить параметры типа Func<> с помощью сопоставителя It.IsAnyType.

...