Moq ReturnsAsync utilizzando molti parametri

Nov 21 2020

Sto usando la ReturnsAsyncfunzione di Moq con successo da un po ', ma ho riscontrato un problema con quanto segue. Restituisco sempre null mentre aggiungo i parametri alla mia espressione lambda ... questa volta quando li ho aggiunti tutti, ottengo il temuto "Impossibile convertire l'espressione lambda in tipo ..." C'è qualcosa di ovvio che ho ottenuto sbagliato? Il Setupmetodo si risolve perfettamente ... ma noReturnsAsync

C'è un limite al numero di parametri che possono essere definiti? Ho provato e ho notato che cede dopo il 15 ° parametro ...

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

Risposte

1 Toffer Nov 24 2020 at 02:08

Quello che ho scoperto è che la radice del mio problema è questa ...

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 massimo consentirà solo di utilizzare fino a 15 parametri nella firma dell'espressione lambda.

Tuttavia avevo solo bisogno di quello IEnumerable nel mio metodo delegato ReturnsAsync, quindi sono bravo ... Mi sbagliavo in quanto pensavo di dover specificare un parametro per tutti i parametri nel metodo che viene simulato nella chiamata "Setup". ..ora che ho scoperto che non hai bisogno di farlo, sono a posto. :)