Moq ReturnsAsync menggunakan banyak parameter

Nov 21 2020

Saya telah menggunakan ReturnsAsyncfungsi dari Moq dengan sedikit keberhasilan, tetapi mengalami masalah dengan berikut ini. Saya selalu mengembalikan nol saat menambahkan parameter ke ekspresi lambda saya ... kali ini ketika saya menambahkan semuanya, saya mendapatkan pertanyaan "Tidak dapat mengubah ekspresi lambda menjadi jenis ..." Apakah ada sesuatu yang jelas yang saya dapatkan salah? The SetupMetode resolves baik-baik saja ... hanya tidakReturnsAsync

Apakah ada batasan berapa banyak parameter yang dapat ditentukan? Saya sudah mencoba dan memperhatikan bahwa itu keluar setelah parameter ke-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;
    });

Jawaban

1 Toffer Nov 24 2020 at 02:08

Apa yang saya temukan adalah akar dari masalah saya adalah ini ...

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 hanya akan memungkinkan Anda menggunakan hingga 15 parameter dalam tanda tangan ekspresi lambda Anda.

Namun saya hanya membutuhkan satu IEnumerable dalam metode delegasi ReturnsAsync saya, jadi saya baik-baik saja ... Saya salah karena saya pikir saya harus menentukan parameter untuk semua orang parameter dalam metode yang diejek dalam panggilan "Setup". ..sekarang bahwa saya telah menemukan Anda tidak perlu melakukan itu, saya baik untuk pergi. :)