Есть ли интерфейсная оболочка вокруг библиотеки параллельных задач, чтобы я мог поменять ее для модульного тестирования? - PullRequest
3 голосов
/ 23 августа 2010

Я задал этот вопрос некоторое время назад.Теперь я знаю, что это плохая идея, и что инкапсуляция планирования и выполнения задач должна быть абстрагирована, чтобы можно было передать синхронный планировщик из модульных тестов.

В настоящее время у меня есть код, который использует Task Parallel Library (TPL), и я хотел бы добавить что-то вроде ITaskScheduler в мои типы, чтобы исключить ответственность за планирование и дать мне возможность пройти синхронную альтернативу в моих тестах.

Существует ли такая вещь?Я ищу что-то, что окутывает Task.Factory.StartNew и Task.ContinueWith.Я не думаю, что это не так уж много работы, чтобы бросить мою собственную, но я уверен, что есть много маленьких хитов , и я действительно не хочу тратить время на то, чтобы сделать это, если оно уже доступно.

Ответы [ 2 ]

5 голосов
/ 02 сентября 2010

Заменить класс Task сложно, даже если вы унаследуете новый класс от Task: поскольку TaskScheduler и TaskFactory не являются универсальными для Task, это совсем не поможет.

В моем опыте лучше подходить к использованию собственного класса TaskScheduler (унаследованного от TaskScheduler).Вы можете передать его в конструктор TaskFactory, а затем использовать его TaskFactory.

Теперь для тестирования вы можете использовать другой TaskScheduler с различной степенью параллелизма (до 1 потока, если хотите)и вы можете добавить дополнительную запись в свой класс TaskScheduler, чтобы регистрировать каждую задачу, когда она начинается и заканчивается.

2 голосов
/ 24 августа 2010

Вы можете определить такой интерфейс и обернуть фактические библиотечные классы внутри фасада, который реализует интерфейс. Для тестирования поменяйте свой Фасад с фиктивным объектом.

...