Moq ReturnsAsync mit vielen Parametern
Ich habe die ReturnsAsync
Funktion 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 Setup
Methode 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
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. :) :)