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?
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();
});
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()
);
});