web-dev-qa-db-fra.com

Returnsasync (null) crée une erreur de génération lors de l'utilisation de Moq pour les tests unitaires dans VS15

Lorsque j'utilise ReturnsAsync(null) dans une méthode de test unitaire C # dans Visual Studio (avec Moq), j'obtiens l'erreur:

"L'appel est ambigu entre les méthodes ou propriétés suivantes"

puis une liste des méthodes ReturnsAsync qui ont des paramètres différents. Je comprends que cela est dû à la surcharge de la fonction ReturnsAsync. Cependant, lorsque j'exécute le même test unitaire sur l'ordinateur de mon collègue, il s'exécute sans aucune erreur. Est-ce que quelqu'un sait pourquoi cela se produirait? Est-ce que quelqu'un sait comment réparer ceci?

De plus, lorsque je crée, je reçois des avertissements qui:

tous les packages référençant ******** doivent installer le package nuget Microsoft.Bcl.Build.

Cela pourrait-il avoir un effet?

23
Justin Borromeo

Il existe deux méthodes d'extension ReturnsAsync dans la classe Moq ReturnsExtensions. Elles ont les paramètres suivants:

(this IReturns<TMock, Task<TResult>> mock, TResult value)
(this IReturns<TMock, Task<TResult>> mock, Func<TResult> valueFunction)

Comme vous pouvez le voir, un accepte une valeur qui doit être renvoyée par tâche, et un autre accepte un délégué qui renvoie une valeur. Lorsque vous passez le compilateur null, je ne sais pas s'il vaut ou s'il délègue. Ce n'est pas le cas lorsque le paramètre de tâche est un type de valeur (par exemple int). Parce qu'il ne peut pas être null et que le compilateur comprend que null est un délégué. C'est probablement le cas avec l'ordinateur de votre collègue.

Pour corriger cette erreur, vous devez aider le compilateur à choisir la surcharge de méthode correcte - transformez null en type de résultat de la tâche (par exemple chaîne):

RetursAsync((string)null)

Ou vous pouvez passer une valeur nulle

string s = null;
... ReturnsAsync(s);
42
Sergey Berezovskiy