У меня есть проект модульного тестирования, использующий 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 (), поскольку основной поток будет заблокирован до завершения операции.
Это актуально в моем тестовом проекте, так как у меня есть другие подобные тестовые случаи, когда данные должны извлекаться таким же образом, и поэтому я хочу избежать слишком большого количества блокирующих вызовов, но вместо этого сохранить асинхронное / ожидающее распространение.