Je suis sur le point d'utiliser un lambda avec une fonction à paramètres multiples, mais Moq lève cette exception lors de l'exécution lorsque j'essaie d'appeler la ligne mock.Object.Convert(value, null, null, null);
.
System.Reflection.TargetParameterCountException: incohérence du nombre de paramètres
Le code est:
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);
Quelle est la bonne façon de le mettre en œuvre?
C'est votre clause Returns
. Vous avez une méthode à 4 paramètres que vous configurez, mais vous n'utilisez qu'un lambda à 1 paramètre. J'ai exécuté 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.
Pas une réponse pour OP mais peut-être pour les futurs googleurs:
J'avais un Callback
qui ne correspondait pas à la signature de la méthode en cours de configuration
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.
});
Cela était le résultat d'une refactorisation et l'outil de refactorisation ne pouvait bien sûr pas réaliser que la signature Callback
était incorrecte
Dans mon cas, je pensais que le type dans Returns<>
Était le type de sortie, mais en fait c'était le ou les types d'entrée.
Donc, si vous avez une méthode
public virtual string Foo(int a, int b) { ... }
La bonne clause est .Returns<int, int>(...)
, PAS .Returns<string>(...)
, ce que je pensais initialement.
Mon erreur était parce que je testais une fonction avec le même type d'entrée et de retour au départ - par exemple public virtual string Foo(string a)
.
C'est peut-être parce que vous passez null
mais It.IsAny<Object>()
attend tout object
sauf null
? Que se passe-t-il si vous procédez comme suit?:
var actual = mock.Object.Convert(value, new object(), typeof(object), CultureInfo.CurrentCulture);
C'est juste un coup de couteau dans le noir de ma part, je connais mieux Rhino.Mocks.
Ma 2e supposition:
Après avoir consulté le Moq.chm fourni avec le téléchargement,
Vous utilisez la méthode Setup(Expression<Action<T>>)
qui "Spécifie une configuration sur le type simulé pour un appel à une méthode void
."
Vous voulez la méthode _ Setup<TResult>(Expression<Func<T,TResult>>)
qui "spécifie une configuration sur le type simulé pour un appel à une méthode de retour de valeur".
Vous pouvez donc essayer:
mock.Setup<Int32>(
conv => {
conv.Convert(
It.IsAny<Object>(),
It.IsAny<Type>(),
It.IsAny<Object>(),
It.IsAny<CultureInfo>());
return num + 5;
});