web-dev-qa-db-fra.com

Objets fictifs - Méthode de configuration - Développement piloté par les tests

J'apprends le développement piloté par les tests et j'essaie d'utiliser la bibliothèque Moq pour se moquer. Quel est le but de la méthode d'installation de la classe Mock?

34
meckrt

Le comportement par défaut d'un objet Moq Mock est de bloquer toutes les méthodes et propriétés. Cela signifie qu'un appel à cette méthode/propriété avec tous les paramètres n'échouera pas et renverra une valeur par défaut pour le type de retour particulier.

Vous appelez la méthode Setup pour tout ou partie des raisons suivantes:

  • Vous souhaitez restreindre les valeurs d'entrée à la méthode.
public interface ICalculator {
  int Sum(int val1, val2);
}

var mock = new Mock<ICalculator>();
mock.Setup(m=>m.Sum(
  It.IsAny<int>(), //Any value
  3                //value of 3
));

La configuration ci-dessus correspondra à un appel à la méthode Sum avec n'importe quelle valeur pour val1 Et val2 Valeur de 3.

  • Vous souhaitez renvoyer une valeur spécifique. En continuant avec l'exemple ICalculator, la configuration suivante renverra une valeur de 10 quels que soient les paramètres d'entrée:
var mock = new Mock<ICalculator>();
mock.Setup(m=>m.Sum(
  It.IsAny<int>(), //Any value
  It.IsAny<int>()  //Any value
)).Returns(10);
  • Vous souhaitez utiliser Mock<T>.VerifyAll() après avoir effectué les configurations pour vérifier que toutes les configurations précédentes ont été appelées (une fois).
var mock = new Mock<ICalculator>();
mock.Setup(m=>m.Sum(
  7, //value of 7
  3                //value of 3
));

mock.Setup(m=>m.Sum(
  5, //value of 5
  3                //value of 3
));

mock.VerifyAll();    

Le code ci-dessus vérifie que Sum est appelé deux fois. Une fois avec (7,3) Et une fois avec (5,3).

44
Igor Zevaka

La méthode de configuration est utilisée pour définir les attentes sur l'objet factice. Par exemple:

mock.Setup(foo => foo.DoSomething("ping")).Returns(true);

Ici, vous définissez la méthode DoSomething sur un objet factice. Vous dites, lorsque le paramètre est "ping", la méthode renvoie true.

Maintenant, cet objet peut en outre servir de maquette ou de talon en fonction de votre utilisation. Si vous souhaitez l'utiliser dans des tests basés sur un état, il peut agir comme un stub. Si vous souhaitez l'utiliser dans des tests basés sur le comportement, il peut servir de maquette. Dans les tests de comportement, vous appellerez la méthode verify sur l'objet fictif pour affirmer que la méthode a été appelée avec le paramètre "ping"

Reportez-vous également à ces liens:

http://martinfowler.com/articles/mocksArentStubs.html

http://code.google.com/p/moq/wiki/QuickStart

11
P.K