많은 매개 변수를 사용하는 Moq ReturnsAsync

Nov 21 2020

ReturnsAsyncMoq 의 기능을 잠시 동안 성공적 으로 사용 했지만 다음과 같은 문제가 발생했습니다. 람다 식에 매개 변수를 추가하는 동안 항상 null을 반환합니다. 이번에는 모든 매개 변수를 추가했을 때 "람다 식을 형식으로 변환 할 수 없습니다 ..."라는 두려운 메시지가 표시됩니다. 잘못된? 이 Setup방법은 완벽하게 잘 해결됩니다 ...ReturnsAsync

정의 할 수있는 매개 변수 수에 제한이 있습니까? 나는 시도했고 그것이 15 번째 매개 변수 이후에 쓰레기라는 것을 알았습니다 ...

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

답변

1 Toffer Nov 24 2020 at 02:08

내가 발견 한 것은 내 문제의 근원은 이것이다 ...

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;

ReturnAsync at max는 람다 식의 서명에 최대 15 개의 매개 변수 만 사용할 수 있도록 허용합니다.

그러나 내 ReturnsAsync 델리게이트 메서드 내에서 IEnumerable 하나만 필요했기 때문에 좋습니다. "Setup"호출에서 모의되는 메서드에서 모든 매개 변수에 대한 매개 변수를 지정해야한다고 생각했습니다. .. 이제 당신이 그렇게 할 필요가 없다는 것을 알았으니 갈 수 있습니다. :)