Как выполнить модульное тестирование метода, который порождает потоки? - PullRequest
7 голосов
/ 20 января 2010

Я довольно новичок в TDD, но использую его достаточно долго, чтобы понять, как использовать макеты, заглушки, внедрение зависимостей, инверсию управления для решения «похожих» проблем ... но по какой-то причине я чувствую себя очень неловко из-за используя внедрение зависимостей и передавая IThread (или аналогичный).

Чтобы дать ему некоторый базовый контекст - я пытаюсь добавить модульные тесты в унаследованное приложение, и я не уверен, как выполнить модульное тестирование класса, конструктор которого порождает два потока.

Является ли единственным вариантом использования внедрения зависимостей?

Если так, как насчет функциональности, которую предоставляют потоки? В этом состоянии потоки запускаются в то время как циклы while (true) и никогда не выходят из цикла (если только приложение не завершается). Внутри циклов есть разумные куски кода, и именно этот код я действительно хочу протестировать.

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

Есть предложения?

1 Ответ

5 голосов
/ 20 января 2010

Не могли бы вы использовать эту функциональность для внутренних методов и использовать вместо нее InternalsVisibleTo? Даже если вы действительно хотите, чтобы они были конфиденциальными, это разумное компромиссное решение.

Если ваши потоки обычно работают вечно, это очень усложняет тестирование ... и звучит так, как будто вы действительно должны тестировать часть "что делают потоки" отдельно, если они не зависят от при нахождении в отдельных темах.

Один из вариантов, который иногда полезен, - это иметь интерфейс типа IScheduler - попросить выполнить действие, где он сочтет нужным; производственный создаст новый поток, но ваш тестовый может запустить действие в существующем потоке (или в потоке, которым вы управляете в своем тестовом коде). Я не уверен, что это подходит для вашей ситуации здесь, где поток будет работать вечно, но вы можете подумать об этом в других ситуациях.

...