Comment puis-je Moq une méthode qui a un argument facultatif dans sa signature sans le spécifier explicitement ou utiliser une surcharge?

Vu l’interface suivante:

public interface IFoo { bool Foo(ssortingng a, bool b = false); } 

Tenter de se moquer en utilisant Moq:

 var mock = new Mock(); mock.Setup(mock => mock.Foo(It.IsAny())).Returns(false); 

donne l’erreur suivante au moment de la compilation:

Un arbre d’expression ne peut pas contenir d’appel ou d’invocation utilisant des arguments facultatifs

J’ai trouvé le problème ci-dessus soulevé comme une amélioration dans la liste des problèmes de Moq et il semble être assigné à la version 4.5 (à chaque fois).

Ma question est la suivante: que dois-je faire étant donné que ce qui précède ne va pas être résolu de sitôt? Mes options ne sont-elles que pour définir explicitement la valeur par défaut du paramètre optionnel chaque fois que je me moque de lui (ce qui va à l’encontre de la spécification) ou pour créer une surcharge sans le bool (comme ce que j’aurais fait avant C # 4)?

Ou quelqu’un a-t-il trouvé une façon plus intelligente de surmonter ce problème?

Je crois que votre seul choix en ce moment est d’inclure explicitement le paramètre bool dans la configuration de Foo .

Je ne pense pas que cela défait le but de spécifier une valeur par défaut. La valeur par défaut est une commodité pour le code d’appel, mais je pense que vous devriez être explicite dans vos tests. Disons que vous pourriez laisser de côté la spécification du paramètre bool . Que se passe-t-il si, à l’avenir, quelqu’un modifie la valeur par défaut de b sur true ? Cela conduira à des tests infructueux (et à juste titre), mais ils seront plus difficiles à corriger en raison de l’hypothèse cachée selon laquelle b est false . Spécifier explicitement le paramètre bool a un autre avantage: il améliore la lisibilité de vos tests. Quelqu’un qui les traverse saura rapidement qu’il existe une fonction Foo qui accepte deux parameters. C’est mes 2 centimes, au moins 🙂

En ce qui concerne la spécification à chaque fois que vous vous en moquez, ne dupliquez pas le code: créez et / ou initialisez la maquette dans une fonction, de sorte que vous n’ayez qu’un seul sharepoint changement. Si vous le voulez vraiment, vous pouvez surmonter les apparentes lacunes de Moq en dupliquant les parameters de Foo dans cette fonction d’initialisation:

 public void InitFooFuncOnFooMock(Mock fooMock, ssortingng a, bool b = false) { if(!b) { fooMock.Setup(mock => mock.Foo(a, b)).Returns(false); } else { ... } } 

Juste rencontré ce problème aujourd’hui, Moq ne supporte pas ce cas d’utilisation. Donc, semble-t-il, outrepasser la méthode serait suffisant pour ce cas.

 public interface IFoo { bool Foo(ssortingng a); bool Foo(ssortingng a, bool b); } 

Maintenant les deux méthodes sont disponibles et cet exemple fonctionnerait:

 var mock = new Mock(); mock.Setup(mock => mock.Foo(It.IsAny())).Returns(false);