Pourquoi cela fonctionne-t-il Returns((string food) => eat(food))
alors que ce n'est pas le cas: Returns(food => eat(food))
?Pourquoi Moq demande-t-il parfois une déclaration de type explicite dans les retours?
exemple de travail complet:
class Program
{
static void Main(string[] args)
{
var animal = new Mock<IAnimal>();
Func<string, string> eat = food => $"Nom nom nom {food}";
// works
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns(eat);
// works
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns((string food) => eat(food));
//cannot convert lambda expression to type 'string' because it is not a delegate type
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns(food => eat(food));
//cannot convert lambda expression to type 'string' because it is not a delegate type
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns(food => $"Nom nom nom {food}");
}
}
public interface IAnimal
{
string Eat(string food);
}
Ce n'est pas Moq qui l'exige, c'est le compilateur C#. Il est probable que le nombre énorme de surcharges de la méthode '.Returns' (18 à mon compte) donne au compilateur trop d'options. Aussi, à l'avenir, lorsque le code ne fonctionne pas (comme dans, ne compile pas), s'il vous plaît envoyer le message d'erreur réel. Dans ce cas, il est "Impossible de convertir l'expression lambda en type 'chaîne' car ce n'est pas un type délégué". –
@ LasseV.Karlsen Pour être juste l'erreur est intégrée dans les commentaires de code, même si je suis d'accord, il devrait être plus évident. – DavidG
@ LasseV.Karlsen Je comprends cela, mais j'ai seulement remarqué ce comportement dans la fonction Moq Returns, et je suis curieux de savoir ce qui déclenche le compilateur en ne trouvant pas la bonne méthode pour appeler. Je m'attends à ce qu'il y ait un conflit avec certaines des autres méthodes de retours, mais lequel? –