Moq ReturnsAsync mit vielen Parametern

Nov 21 2020

Ich habe die ReturnsAsyncFunktion von Moq ein wenig mit Erfolg verwendet, bin aber auf ein Problem mit den folgenden gestoßen. Ich gebe immer nur null zurück, während ich die Parameter zu meinem Lambda-Ausdruck hinzufüge. Dieses Mal, wenn ich sie alle hinzugefügt habe, erhalte ich die gefürchtete Meldung "Lambda-Ausdruck kann nicht in Typ konvertiert werden ...". Gibt es etwas Offensichtliches, das ich habe? falsch? Die SetupMethode löst sich einwandfrei auf ... nur nichtReturnsAsync

Gibt es eine Begrenzung für die Anzahl der Parameter, die definiert werden können? Ich habe versucht und bemerkt, dass es nach dem 15. Parameter ausfällt ...

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

Antworten

1 Toffer Nov 24 2020 at 02:08

Was ich entdeckt habe, ist die Wurzel meines Problems:

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;

Mit ReturnsAsync bei max können Sie nur bis zu 15 Parameter in der Signatur Ihres Lambda-Ausdrucks verwenden.

Ich brauchte jedoch nur die eine IEnumerable in meiner ReturnsAsync-Delegatenmethode, also bin ich gut ... Ich habe mich geirrt, dass ich dachte, ich müsste einen Parameter für jeden Parameter in der Methode angeben, die im Aufruf "Setup" verspottet wird. ..nun, dass ich festgestellt habe, dass Sie das nicht tun müssen, ich bin gut zu gehen. :) :)