Теория xUnit с асинхронными MemberData - PullRequest
0 голосов
/ 04 мая 2018

У меня есть проект модульного тестирования, использующий xUnit.net v.2.3.1 для моего веб-приложения ASP.NET Core 2.0.

Мой тест должен сосредоточиться на тестировании данного экземпляра DataEntry: экземпляры DataEntry генерируются асинхронным методом GenerateData () в моем классе DataService, который выглядит следующим образом:

public class DataService {
    ...
    public async Task<List<DataEntry>> GenerateData() {
        ...
    }
    ...
}

Я пишу этот тестовый случай как Теорию, чтобы мой тест мог сосредоточиться на экземпляре DataEntry одновременно. Вот код:

[Theory]
[MemberData(nameof(GetDataEntries))]
public void Test_DataEntry(DataEntry entry) {

    // my assertions
    Assert.NotNull(entry);
    ...

}

public static async Task<IEnumerable<object[]>> GetDataEntries() {

    var service = new DataService();
    List<DataEntry> entries = await service.GenerateData().ConfigureAwait(false);

    return entries.Select(e => new object[] { e });

}

Однако я получаю следующую ошибку во время компиляции:

MemberData должен ссылаться на тип данных, присваиваемый «System.Collections.Generic.IEnumerable ». Недопустимый тип ссылки «System.Threading.Tasks.Task >».

Из описания ошибки кажется, что xUnit.net не позволяет MemberData использовать асинхронный статический метод, такой как мой GetDataEntries (). Есть ли в xUnit.net пробел в функциональности, о котором я должен знать?

Теперь я знаю, что могу переключить свою Теорию на Факт и перебрать каждую DataEntry в списке, возвращаемом моим DataService, однако я бы предпочел сохранить настройку Theory, поскольку мой тест был бы более чистым и сфокусированным на DataEntry вместо List .

Вопрос : есть ли способ в xUnit.net , чтобы моя Теория могла получать данные из моего асинхронного API DataService? Обратите внимание, что класс DataService нельзя ни изменять, ни расширять для синхронного предоставления данных.

EDIT

Я ищу способ асинхронизации / ожидания и предпочел бы избегать использования блокирующих вызовов, таких как Задача . Результат, например в моем методе GenerateData (), поскольку основной поток будет заблокирован до завершения операции. Это актуально в моем тестовом проекте, так как у меня есть другие подобные тестовые случаи, когда данные должны извлекаться таким же образом, и поэтому я хочу избежать слишком большого количества блокирующих вызовов, но вместо этого сохранить асинхронное / ожидающее распространение.

...