Moq ReturnsAsync przy użyciu wielu parametrów
Od jakiegoś czasu ReturnsAsync
z powodzeniem używam funkcji Moq, ale napotkałem problem z następującymi. Zawsze zwracam wartość null podczas dodawania parametrów do wyrażenia lambda ... tym razem, gdy dodałem je wszystkie, pojawia się przerażający komunikat „Nie można przekonwertować wyrażenia lambda na typ ...” Czy jest coś oczywistego źle? W Setup
postanawia metoda perfekcyjnie ... po prostu nieReturnsAsync
Czy istnieje ograniczenie liczby parametrów, które można zdefiniować? Próbowałem i zauważyłem, że po 15. parametrze się psuje ...
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;
});
Odpowiedzi
Odkryłem, że źródłem mojego problemu jest to ...
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 at max pozwoli tylko na użycie maksymalnie 15 parametrów w podpisie wyrażenia lambda.
Jednak potrzebowałem tylko jednego IEnumerable w mojej metodzie delegata ReturnsAsync, więc jestem dobry ... Pomyliłem się, myśląc, że muszę określić parametr dla każdego parametru w metodzie, która jest mockowana w wywołaniu „Setup”. .. teraz, gdy stwierdziłem, że nie musisz tego robić, jestem gotowy. :)