Как протестировать ToListAsyn c с помощью тестовых случаев IsFapted, IsCanceled и IsCompleted - PullRequest
0 голосов
/ 03 февраля 2020

Привет, ребята, у меня есть такой метод:

public virtual async Task StartSearch()
{
    CancellationTokenSource = new CancellationTokenSource();
    Context = ContextFactory.Create();

    SearchResults = await Task.Factory.StartNew(() =>
    {
        try
        {
            IsLoading = true;

            var resultTask = GetResults().ToListAsync(CancellationTokenSource.Token);

            while (!resultTask.IsCompleted && !resultTask.IsFaulted &&
                   !CancellationTokenSource.Token.IsCancellationRequested)
                Thread.Sleep(100);

            IsLoading = false;

            if (resultTask.IsFaulted)
                throw resultTask.Exception ??
                      new Exception("Some error.");

            return resultTask.IsCompleted && !resultTask.IsCanceled ? resultTask.Result : null;
        }
        catch (Exception)
        {
            IsLoading = false;
            throw;
        }
    }, CancellationTokenSource.Token) ?? SearchResults;
}

Интересно, как я могу создать макет Задачи (со всеми этими полями IsFapted, IsCompleted, IsCaneled), которую я получаю из .ToListAsyn c () метод? Я обнаружил, что они не являются виртуальными, поэтому я не могу создать объект Task, чтобы просто издеваться над ними. Дополнительный вопрос: даст ли он мне что-нибудь, если я создам свой собственный фиктивный класс и высмею его для теста.

Каковы ваши предложения? Может быть, вы не хотите издеваться над этим?

Пока я только проверял это, чтобы проверить, вернет ли мой метод некоторые данные.

РЕДАКТИРОВАТЬ:

public abstract IQueryable<dynamic> GetResults();

и некоторые примерные реализации:

public override IQueryable<dynamic> GetResults()
{
    var query = Context.Table.AsQueryable();

    query = string.IsNullOrWhiteSpace(Field)
        ? query
        : query.Where(table => table.Field.Contains(SomeFilter));

    return query.Select(
            table => new
            {
                table.Field1,
                table.Field2,
                table.Field3
            }).OrderBy(table => table.Id);
}
...