Moq ReturnsAsync usando muchos parámetros

Nov 21 2020

He estado usando la ReturnsAsyncfunción de Moq con éxito durante un tiempo, pero me he encontrado con un problema con lo siguiente. Siempre devuelvo nulo mientras agrego los parámetros a mi expresión lambda ... esta vez, cuando los agregué todos, obtengo el temido "No se puede convertir la expresión lambda al tipo ..." ¿Hay algo obvio que obtuve? ¿incorrecto? El Setupmétodo se resuelve perfectamente bien ... pero noReturnsAsync

¿Existe un límite para la cantidad de parámetros que se pueden definir? Lo intenté y noté que se estropea después del parámetro 15 ...

var buildServiceMock = new Mock<IBuildService>();

buildServiceMock
    .Setup(bsm => bsm.QueryBuildsAsync(
        It.IsAny<BuildType>(),
        It.IsAny<string>(),
        It.IsAny<DateTime?>(),
        It.IsAny<DateTime?>(),
        It.IsAny<string>(),
        It.IsAny<BuildReason?>(),
        It.IsAny<BuildStatus?>(),
        It.IsAny<BuildResult?>(),
        It.IsAny<IEnumerable<string>>(),
        It.IsAny<IEnumerable<string>>(),
        It.IsAny<int?>(),
        It.IsAny<int?>(),
        It.IsAny<QueryDeletedOption?>(),
        It.IsAny<BuildQueryOrder?>(),
        It.IsAny<string>(),
        It.IsAny<IEnumerable<int>>(),
        It.IsAny<string>(),
        It.IsAny<CancellationToken>()))
    .ReturnsAsync((
        BuildType buildType,
        string buildNumber,
        DateTime? minDateTime,
        DateTime? maxDateTime,
        string requestedFor,
        BuildReason? reasonFilter,
        BuildStatus? statusFilter,
        BuildResult? resultFilter,
        IEnumerable<string> tags,
        IEnumerable<string> properties,
        int? top,
        int? maxBuildsPerDefinition,
        QueryDeletedOption? deletedFilter,
        BuildQueryOrder? queryOrder,
        string branchName,
        IEnumerable<int> buildIds,
        string label,
        CancellationToken cancellationToken) =>
    {
        return null;
    });

Respuestas

1 Toffer Nov 24 2020 at 02:08

Lo que he descubierto es que la raíz de mi problema es esto ...

public static IReturnsResult<TMock> ReturnsAsync<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMock, TResult>(this IReturns<TMock, ValueTask<TResult>> mock, Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TResult> valueFunction) where TMock : class;

ReturnsAsync al máximo solo le permitirá usar hasta 15 parámetros en la firma de su expresión lambda.

Sin embargo, solo necesitaba el IEnumerable dentro de mi método delegado ReturnsAsync, así que estoy bien ... Me equivoqué al pensar que tenía que especificar un parámetro para todos los parámetros en el método que se está simulando en la llamada "Configuración". .. ahora que he descubierto que no necesitas hacer eso, estoy listo para irme. :)