Тестовый класс выполняет несколько тестов, которые связаны друг с другом. Тестовый класс обычно тестирует класс или группу классов, которые тесно сотрудничают. Иногда тестовый класс проверяет только одну функцию.
Обычно тесты должны быть спроектированы таким образом, чтобы они не зависели от других тестов: тест А должен пройти успешно без запуска теста Б, и наоборот: тесты могут не предполагать ничего о других тестах.
Обычно тест создает некоторое предварительное условие, вызывает тестируемую функцию и проверяет, выполняется ли постусловие. Поэтому каждый тест обычно создает свою собственную среду.
Если группе тестов требуется аналогичная среда, чтобы сэкономить время тестирования, довольно распространено создать среду один раз для всех этих тестов, запустить тесты и утилизировать среду. Это то, что вы делаете в своем тестовом классе.
Однако, если в одном из ваших тестов вы создаете задачу для вызова асинхронной функции, вам следует подождать в этом тесте результата этой задачи. Если вы этого не сделаете, вы не сможете проверить, выполняет ли асинхронная функция то, для чего она предназначена, а именно: «Создать задачу, которая, когда ожидается, возвращает ...».
void TestA()
{
Task taskA = null;
try
{
// start a task without awaiting
taskA = DoSomethingAsync();
// perform your test
...
// wait until taskA completes
taskA.Wait();
// check the result of taskA
...
}
catch (Exception exc)
{
...
}
finally
{
// make sure that even if exception TaskA completes
taskA.Wait();
}
}
Вывод: каждый метод Test, создающий задачу, должен дождаться завершения этого класса до завершения
В редких случаях вам не нужно ждать, пока задание завершится, до завершения теста. Может быть, посмотреть, что произойдет, если вы не дождетесь этой задачи. Я все еще думаю, что это странная идея, потому что это может повлиять на другие тесты, но, эй, это ваш тестовый класс.
Это означает, что ваш Dispose должен удостовериться, что ожидаются все запущенные задачи, которые не были завершены к моменту окончания метода тестирования.
List<Task> nonAwaitedTasks = new List<Task>();
var TestA()
{
// start a Task, for some reason you don't want to await for it:
Task taskA = DoSomethingAsync(...);
// perform your test
// finish without awaiting for taskA. Make sure it will be awaited before the
// class is disposed:
nonAwaitedTasks.Add(taskA);
}
public void Dispose()
{
Dispose(true);
}
protected void Dispose(bool disposing)
{
if (disposing)
{
// wait for all tasks to complete
Task.WaitAll(this.nonAwaitedTasks);
}
}
}