web-dev-qa-db-fra.com

Moq ReturnsAsync () avec paramètres

J'essaie de me moquer de la méthode d'un référentiel comme ça

public async Task<WhitelistItem> GetByTypeValue(WhitelistType type, string value)

en utilisant Moq ReturnsAsync, comme ceci:

static List<WhitelistItem> whitelist = new List<WhitelistItem>();

var whitelistRepositoryMock = new Mock<IWhitelistRepository>();

whitelistRepositoryMock.Setup(w => w.GetByTypeValue(It.IsAny<WhitelistType>(), It.IsAny<string>()))
                                    .ReturnsAsync((WhitelistType type, string value) =>
                                    {
                                        return (from  item in whitelist
                                                where item.Type == type && item.Value == value
                                                select item).FirstOrDefault();
                                    });

mais je reçois cette erreur dans la ligne "... ReturnsAsync ((type WhitelistType ...):

Impossible de convertir l'expression lambda en type 'Model.WhitelistItem' car ce n'est pas un type délégué

WhitelistType est un Enum comme ça:

public enum WhitelistType
    {
        UserName,
        PostalCode
    }

J'ai cherché par heures et je n'ai trouvé aucune réponse à mon problème.

Des indices?

39
Daniel Medina

À partir de Moq v4.5.28

Vous pouvez utiliser ReturnsAsync avec lambdas, exactement comme dans l'exemple de code de la question. Plus besoin d'utiliser Task.FromResult(). Vous avez juste besoin de spécifier les types d'arguments délégués lambda. Sinon, vous obtiendrez le même message d'erreur:

Impossible de convertir l'expression lambda en type 'Model.WhitelistItem' car ce n'est pas un type délégué

Pour donner un exemple, ce qui suit fonctionne avec la dernière version de Moq:

whitelistRepositoryMock.Setup(w => w.GetByTypeValue(It.IsAny<WhitelistType>(), It.IsAny<string>()))
                                .ReturnsAsync((WhitelistType type, string value) =>
                                {
                                    return (from  item in whitelist
                                            where item.Type == type && item.Value == value
                                            select item).FirstOrDefault();
                                });

Avant Moq v4.5.28 (réponse fournie par Alexei Levenkov )

Vous devez utiliser Returns avec Task.FromResult:

.Returns((WhitelistType type, string value) =>
 {
     return Task.FromResult(
       (from  item in whitelist
           where item.Type == type && item.Value == value
           select item).FirstOrDefault()
       );
});
28
Paul Siersma