67 votes

Moq + Unit Testing - System.Reflection.TargetParameterCountException: Incompatibilité du nombre de paramètres

 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);
 

Ce code génère une erreur System.Reflection.TargetParameterCountException: Parameter count mismatch. lorsque j'essaie d'appeler la ligne mock.Object.Convert(value, null, null, null); . Je ne sais pas si j'utilise Moq incorrectement ou quoi ...

127voto

Erik Dietrich Points 3646

C'est votre clause Returns . Vous avez configuré une méthode à 4 paramètres, mais vous n’utilisez qu’un lambda à 1 paramètre. J'ai couru ce qui suit sans problème:

     [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);
    }
 

Aucune exception, test réussi.

1voto

Grokodile Points 1518

Peut-être que c'est parce que vous êtes de passage null mais It.IsAny<Object>() s'attend à tout object sauf null? Qu'advient-il si vous ne le suivant?:

var actual = mock.Object.Convert(value, new object(), typeof(object), CultureInfo.CurrentCulture);

C'est juste un coup de poignard dans le noir de moi, je suis plus familier avec Rhino.Des simulacres.


Mon 2ème deviner:

Après avoir regardé le Moq.chm qui vient avec le téléchargement,

Vous êtes à l'aide de l' Setup(Expression<Action<T>>) méthode qui "Spécifie un programme d'installation sur le se moquaient de type pour un appel vers un void méthode."

Tu veux te Setup<TResult>(Expression<Func<T,TResult>>) méthode qui "Spécifie un programme d'installation sur le se moquaient de type pour un appel à une valeur de retour de la méthode".

De sorte que vous pourriez essayer:

mock.Setup<Int32>(
    conv => {
        conv.Convert(
            It.IsAny<Object>(), 
            It.IsAny<Type>(),
            It.IsAny<Object>(), 
            It.IsAny<CultureInfo>());
        return  num + 5;
        });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X