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 65

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>>) метод, который " указывает настройку на издевательский тип для вызова a void метод."

вы хотите 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).