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

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

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

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


person Steve Dunn    schedule 23.08.2010    source источник
comment
Я не думаю, что могут быть какие-то ошибки, если вы поместите Task API прямо за интерфейс. Использование этого интерфейса не должно сильно отличаться от прямого использования API.   -  person Stefan Steinegger    schedule 23.08.2010


Ответы (2)


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

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

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

person Ian Mercer    schedule 02.09.2010

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

person Christoph    schedule 24.08.2010