J'ai une interface qui déclare
Task DoSomethingAsync();
J'utilise MoqFramework pour mes tests:
[TestMethod()]
public async Task MyAsyncTest()
{
Mock<ISomeInterface> mock = new Mock<ISomeInterface>();
mock.Setup(arg => arg.DoSomethingAsync()).Callback(() => { <my code here> });
...
}
Ensuite, dans mon test, j'exécute le code qui invoque await DoSomethingAsync()
. Et le test échoue simplement sur cette ligne. Qu'est-ce que je fais mal?
c#
unit-testing
task-parallel-library
moq
Waldemar
la source
la source
Réponses:
Votre méthode n'a pas de rappel, il n'y a donc aucune raison de l'utiliser
.CallBack()
. Vous pouvez simplement renvoyer une tâche avec les valeurs souhaitées en utilisant.Returns()
et Task.FromResult , par exemple:Mise à jour 2014-06-22
Moq 4.2 a deux nouvelles méthodes d'extension pour vous aider.
Mise à jour 2016-05-05
Comme le mentionne Seth Flowers dans l' autre réponse ,
ReturnsAsync
n'est disponible que pour les méthodes qui renvoient aTask<T>
. Pour les méthodes qui renvoient uniquement une tâche,peut être utilisé.
Comme indiqué dans cette réponse , dans .NET 4.6, cela est simplifié
.Returns(Task.CompletedTask);
, par exemple:la source
.Returns(Task.FromResult(default(object))
fonctionne bien lorsque le type de retour est nul..Returns(Task.FromResult(null as MyType))
fonctionne bien lorsque le type de retour attendu est nul.default(object)
n'est plus nécessaire.null as MyType
est le même tantdefault(MyType)
qu'ilMyType
s'agit d'un type de référence.Problème similaire
J'ai une interface qui ressemble à peu près à:
Symptômes
Mon test unitaire a échoué lorsque mon service sous test a
awaited
appeléDoSomething
.Réparer
Contrairement à la réponse acceptée, vous ne pouvez pas faire appel
.ReturnsAsync()
à votreSetup()
de cette méthode dans ce scénario, car la méthode renvoie le non génériqueTask
plutôt queTask<T>
.Cependant, vous pouvez toujours l'utiliser
.Returns(Task.FromResult(default(object)))
sur la configuration, ce qui permet au test de passer.la source
Vous devez seulement ajouter
.Returns(Task.FromResult(0));
après le rappel.Exemple:
la source
Vous pouvez désormais également utiliser le package Talentsoft.Moq.SetupAsync https://github.com/TalentSoft/Moq.SetupAsync
Lequel sur la base des réponses trouvées ici et des idées proposées à Moq mais toujours pas encore implémentées ici: https://github.com/moq/moq4/issues/384 , simplifie grandement la configuration des méthodes asynchrones
Quelques exemples trouvés dans les réponses précédentes faites avec l'extension SetupAsync:
la source