Moq ReturnsAsync usando muitos parâmetros
Tenho usado a ReturnsAsyncfunção do Moq com sucesso por um tempo, mas encontrei um problema com o seguinte. Eu sempre retorno nulo enquanto estou adicionando os parâmetros à minha expressão lambda ... desta vez, quando adicionei todos eles, recebo o temido "Não é possível converter a expressão lambda em tipo ..." Há algo óbvio que recebi errado? O Setupmétodo resolve perfeitamente bem ... mas nãoReturnsAsync
Existe um limite para quantos parâmetros podem ser definidos? Eu tentei e notei que ele falha após o 15º parâmetro ...
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;
});
Respostas
O que descobri é que a raiz do meu problema é este ...
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 só permitirá que você use até 15 parâmetros na assinatura da sua expressão lambda.
No entanto, eu só precisava de um IEnumerable em meu método delegado ReturnsAsync, então estou bem ... Eu estava enganado ao pensar que deveria especificar um parâmetro para todos os parâmetros no método sendo simulado na chamada "Setup". ..agora que descobri que você não precisa fazer isso, estou pronto para ir. :)