web-dev-qa-db-fra.com

À l'aide de Moq, comment configurer un appel de méthode avec un paramètre d'entrée en tant qu'objet avec les valeurs de propriété attendues?

 var storageManager = new Mock<IStorageManager>(); 
 storageManager.Setup(e => e.Add(It.IsAny<UserMetaData>()));

La méthode Add () attend un objet UserMetaData qui possède une propriété FirstName.

Je voudrais m'assurer qu'un objet de type UserMetaData avec le FirstName de "FirstName1" a été passé.

32
The Light

Vous pouvez utiliser Verify.

Exemples:

Vérifiez que Add n'a jamais été appelé avec un UserMetaData avec FirstName! = "FirstName1":

storageManager.Verify(e => e.Add(It.Is<UserMetaData>(d => d.FirstName!="FirstName1")), Times.Never());

Vérifiez que Add a été appelé au moins une fois avec un UserMetaData avec FirstName == "FirstName1":

storageManager.Verify(e => e.Add(It.Is<UserMetaData>(d => d.FirstName=="FirstName1")), Times.AtLeastOnce());

Vérifiez que Add a été appelé exactement une fois avec FirstName == "Firstname1" et LastName == "LastName2":

storageManager.Setup(e => e.Add(It.Is<UserMetaData>(data => data.FirstName == "FirstName1"
                                                         && data.LastName  == "LastName2")));

...

storageManager.VerifyAll();
49
sloth

Vous pouvez utiliser la méthode It.Is:

storageManager.Setup(e => e.Add(It.Is<UserMetaData>(data => data.FirstName == "FirstName1")));
11
MatthiasG

La méthode de Dominic Kexel est bonne et fonctionnera. Vous pouvez également utiliser le rappel, ce qui est utile si vous devez effectuer une vérification de la sortie plus compliquée.

 UserMetaData parameter = null;
 var storageManager = new Mock<IStorageManager>(); 
 storageManager
    .Setup(e => e.Add(It.IsAny<UserMetaData>()))
    .Callback((UserMetaData metaData) => parameter = metaData);

 Assert.That(parameter.FirstName, Is.EqualTo("FirstName1")); //If using fluent NUnit

L'avantage de cela est que, si nécessaire, vous pouvez effectuer beaucoup plus de contrôles sur le paramètre plutôt que de simplement vérifier qu'il s'agit de "FirstName1".

L'inconvénient est que si Add est appelé plusieurs fois, seul le paramètre transmis lors du dernier appel sera vérifié (bien que vous puissiez également vérifier qu'il a été appelé une fois).

La réponse de Dominic est meilleure que la mienne pour votre situation précise, mais je voulais signaler Callback pour d'autres situations similaires.

8
Andy Nichols