with verifiable unit tests setup objetos mock and c# unit-testing moq

c# - verifiable - verify moq



Moq ReturnsAsync() con parĂ¡metros (2)

La respuesta aceptada está desactualizada. Ahora puede usar ReturnsAsync con lambdas, exactamente como en el ejemplo de código de la pregunta. Ya no es necesario usar Task.FromResult() . Solo necesita especificar los tipos de argumentos del delegado lambda. De lo contrario obtendrá el mismo mensaje de error:

No se puede convertir la expresión lambda al tipo ''Model.WhitelistItem'' porque no es un tipo de delegado

Para dar un ejemplo, lo siguiente funciona con la última versión 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(); });

Estoy tratando de burlarme del método de un repositorio como ese.

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

usando Moq ReturnsAsync, como este:

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

pero recibo este error en la línea "... ReturnsAsync ((tipo WhitelistType ...):

No se puede convertir la expresión lambda al tipo ''Model.WhitelistItem'' porque no es un tipo de delegado

WhitelistType es un Enum de esa manera:

public enum WhitelistType { UserName, PostalCode }

Busqué por horas y no encontré ninguna respuesta a mi problema.

¿Alguna pista?


ReturnsAsync no tiene la versión lambda a diferencia de Returns una.

Arreglo: utilizar Returns con Task.FromResult

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