Moq + Модульное Тестирование-Система.Отображение.TargetParameterCountException: несоответствие количества параметров
Я пытаюсь использовать лямбду с функцией нескольких параметров, но Moq бросает это исключение во время выполнения, когда я пытаюсь вызвать mock.Object.Convert(value, null, null, null);
линии.
System.Reflection.TargetParameterCountException: Parameter count mismatch
код:
var mock = new Mock<IValueConverter>();
mock.Setup(conv => conv.Convert(It.IsAny<Object>(), It.IsAny<Type>(),
It.IsAny<Object>(), It.IsAny<CultureInfo>())).Returns((Int32 num) => num + 5);
var value = 5;
var expected = 10;
var actual = mock.Object.Convert(value, null, null, null);
каков правильный способ его реализации?
4 ответа:
Это
Returns
предложения. У вас есть 4 параметра метода, который вы настраиваете, но вы используете только 1 параметр лямбда. Я запустил следующее без проблем:[TestMethod] public void IValueConverter() { var myStub = new Mock<IValueConverter>(); myStub.Setup(conv => conv.Convert(It.IsAny<object>(), It.IsAny<Type>(), It.IsAny<object>(), It.IsAny<CultureInfo>())). Returns((object one, Type two, object three, CultureInfo four) => (int)one + 5); var value = 5; var expected = 10; var actual = myStub.Object.Convert(value, null, null, null); Assert.AreEqual<int>(expected, (int) actual); }
никаких исключений, тест пройден.
не ответ для OP, но, возможно, для будущих гуглеров:
Я
Callback
это не соответствует сигнатуре устанавливаемого методаMock .Setup(r => r.GetNextCustomerNumber(It.IsAny<int>())) .Returns(AccountCounter++) .Callback<string, int>(badStringParam, leadingDigit => { // Doing stuff here, note that the 'GetNextCustomerNumber' signature is a single int // but the callback unreasonably expects an additional string parameter. });
Это было результатом некоторого рефакторинга, и инструмент рефакторинга, конечно, не мог понять, что
Callback
подпись была некорректно
возможно, это потому, что вы передаете
null
ноIt.IsAny<Object>()
ожидает каких-либоobject
за исключениемnull
? Что произойдет, если вы сделаете следующее?:var actual = mock.Object.Convert(value, new object(), typeof(object), CultureInfo.CurrentCulture);
это просто удар в темноте от меня, я больше знаком с Rhino.Издевается.
моя вторая догадка:
посмотрев на Moq.chm, который поставляется с загрузкой,
вы используете
Setup(Expression<Action<T>>)
метод, который " указывает настройку на издевательский тип для вызова avoid
метод."вы хотите te
Setup<TResult>(Expression<Func<T,TResult>>)
метод, который "указывает настройку на издевательский тип для вызова метода возврата значения".так что вы можете попробовать:
mock.Setup<Int32>( conv => { conv.Convert( It.IsAny<Object>(), It.IsAny<Type>(), It.IsAny<Object>(), It.IsAny<CultureInfo>()); return num + 5; });
в моем случае, я думал, что типа в
Returns<>
- Это тип вывода, но на самом деле это был тип(ы) ввода.так что если у вас есть метод
public virtual string Foo(int a, int b) { ... }
правильное предложение
.Returns<int, int>(...)
, а не.Returns<string>(...)
это то, что я думал изначально.моя ошибка была в том, что я тестировал функцию с тем же типом ввода и возврата изначально - например
public virtual string Foo(string a)
.