Один из принципов создания тестируемого асинхронного кода - это абстракция планировщика/диспатчера и подстановка его специальной синхронной версии для тестов. Лучше всего через конструктор тестируемого класса. Например из этой
статьи можно использовать некоторые паттерны.