#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)
1 и аргументы) System.Linq.Выражения.Выражение.Вызов (экземпляр выражения, метод MethodInfo,
System.Linq.Expressions.Expression.ValidateCallArgs(Expression
instance, MethodInfo method, ReadOnlyCollection1 arguments)
макет IEnumerable 1, действие
System.Linq.Expressions.Expression.Call(Expression instance,
MethodInfo method, Expression[] arguments) TCall](Mock1 setterExpression, Func
5 callFactory) b__25() Moq.PexProtector.Вызовите [T](функция1 function)
1 макет,
Moq.Mock.SetupSet[T](Mock1 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. Спасибо, Эрик, за подтверждение этого. Похоже, для этого мне придется использовать старомодный тестовый компонент.