Comment faire Moq ignorer les arguments qui sont des ref ou
Dans RhinoMocks, vous pouvez juste dire votre se moque de IgnoreArguments comme une déclaration générale. Dans Moq, paraît-il, vous devez le préciser.IsAny() pour chaque argument. Toutefois, cela ne fonctionne pas pour ref et de sortir des arguments. Comment puis-je tester la méthode suivante où j'ai besoin d'Moq le service interne d'appel pour le retour à un résultat précis:
public void MyMethod() {
//DoStuff
IList<SomeObject> errors = new List<SomeObject>();
var result = _service.DoSomething(ref errors, ref param1, param2);
//Do more stuff
}
Méthode d'essai:
public void TestOfMyMethod() {
//Setup
var moqService = new Mock<IMyService>();
IList<String> errors;
var model = new MyModel();
//This returns null, presumably becuase "errors"
//here does not refer to the same object as "errors" in MyMethod
moqService.Setup(t => t.DoSomething(ref errors, ref model, It.IsAny<SomeType>()).
Returns(new OtherType()));
}
Mise à JOUR: Alors, l'évolution des erreurs de "ref" de "sortir" des œuvres. Donc il semble que la vraie question est d'avoir une référence de paramètre que vous ne pouvez pas injecter.
- Vous pouvez poster à la signature de
DoSomething
parce que dans votre exemple, il a 3 argumentsout errors, param1, param2
mais dans votre test, vous êtes en l'appelant avec deux argumentsout errors, It.IsAny<SomeType>()
Peut-être vous êtes moqué d'un mal de surcharge, parce que votre code doit fonctionner de toute façon voir moq l'aide des méthodes de la section. - C'était juste un exemple - mais j'ai mis à jour le test en parallèle avec l'exemple de code
Vous devez vous connecter pour publier un commentaire.
Comme vous l'avez déjà compris que le problème est avec votre
ref
argument.Moq actuellement uniquement en charge la correspondance exacte pour
ref
arguments, ce qui signifie que l'appel ne corresponde si vous passez par la même instance que vous avez utilisé dans leSetup
. Donc, il n'existe pas de correspondance afinIt.IsAny()
ne fonctionne pas.Voir Moq démarrage rapide
Et Moq groupe de discussion:
Comme @nemesv mentionné précédemment, Il.IsAny retourne null si vous ne pouvez pas l'utiliser comme paramètre de référence. Dans l'ordre pour l'appel à travailler, un objet doit être transmis.
Le problème se produit lorsque vous n'avez pas accès à la création de l'objet que vous êtes désireux de passer par la réf. Si vous N'avez accès à l'objet réel, vous pouvez simplement utiliser dans votre test, et oublier d'essayer de se moquer de tout.
Voici une solution de contournement à l'aide de l'Extraire et Remplacer technique qui vous permettra de faire exactement cela. Comme son nom l'indique, on extrait le problème de code dans sa propre méthode. Ensuite, vous substituez la méthode dans une classe de test qui hérite de la classe sous test. Enfin, vous devez configurer votre objet réel, la passer dans votre nouveau créer la classe de test, et de tester votre par ref appels que vous s'il vous plaît.
Voici longtemps peu (fictive) du code, mais il montre l'avant et l'après, avec un test de passage à la fin.
Réponse à: La configuration Moq à ignorer une méthode virtuelle
Je crois paramètre "CallBase = true" sur la maquette fonctionne. Voir "Personnalisation de se Moquer de Comportement" de la section de Démarrage Rapide