Использование нескольких индексаторов с Moq

#c# #unit-testing #moq

#c# #модульное тестирование #moq

Вопрос:

Я пытался использовать Moq для подделки набора объектов (и получения) с помощью нескольких индексаторов. Ранее я уже довольно давно использовал Moq с отдельными индексаторами, но, похоже, он не работает с использованием нескольких индексаторов. Из своих исследований я знаю, что у Moq могут возникнуть проблемы с его использованием.Есть <> для параметров индексатора, но я также попробовал следующий код с конкретными параметрами (например, mock[1, «BlockItem»]) Вот мой код:

 m_storageAccessor.SetupSet(
mock => mock[It.IsAny<int>(), It.IsAny<string>()] = It.IsAny<object>()).Callback(
                (int i, string s, object o) =>
                       {
                           m_storageAccessor.SetupGet(
                               mock => mock[i, s]).Returns(
                                   () => { return o; });
                       });
 

Это снова генерирует следующее исключение, независимо от того, какие параметры я задаю функции индексатора в SetupSet().

Метод инициализации UnitTest.BonusHandlerTest.MyTestInitialize выдал исключение. Система.Исключение ArgumentNullException: System.Исключение ArgumentNullException: значение не может быть нулевым. Имя параметра: аргументы.

System.Linq.Выражения.Выражение.ValidateArgumentTypes(метод MethodInfo, ReadOnlyCollection 1amp; arguments)
System.Linq.Expressions.Expression.ValidateCallArgs(Expression
instance, MethodInfo method, ReadOnlyCollection
1 и аргументы) System.Linq.Выражения.Выражение.Вызов (экземпляр выражения, метод MethodInfo, 1 arguments)
System.Linq.Expressions.Expression.Call(Expression instance,
MethodInfo method, Expression[] arguments) TCall](Mock
макет IEnumerable 1, действие 1 setterExpression, Func 5 callFactory) b__25() Moq.PexProtector.Вызовите [T](функция 1 function)
Moq.Mock.SetupSet[T](Mock
1 макет, 1 setterExpression, Func условие действия 1) SetupSet(действие `1 setterExpression) UnitTest .BonusHandlerTest.SetupPersistence() в C:perforcedevKHIRST_Client12.BonusHandlerClient12GamingBonusHandlerUnitTestBonusHandlerTest.cs : строка 868 UnitTest.BonusHandlerTest.MyTestInitialize() в C:perforcedevKHIRST_Client12.BonusHandlerClient12GamingBonusHandlerUnitTestBonusHandlerTest.cs : строка 100

Судя по тому, что я пробовал, кажется, что Moq не может создавать индексаторы с несколькими параметрами. У кого-нибудь есть идеи? Межсетевые сети не очень помогли.

Ответ №1:

Как бы то ни было, я настроил этот сценарий, и исключений не было:

         var myStub = new Mock<Foo>();
        myStub.SetupSet(foo => foo[12, "asdf"] = null).Callback((int i, string s, object o) => myStub.SetupGet(foo => foo[i, s]).Returns(o));
 

Похоже, что это не просто нравится It.Есть <> для параметров индексатора, но также и для установленного значения. Я никогда не пытался сделать это в своем тестировании, но мне кажется, что это текущее ограничение инструмента.

Комментарии:

1. Спасибо, Эрик, за подтверждение этого. Похоже, для этого мне придется использовать старомодный тестовый компонент.