В общих чертах: Надежное модульное тестирование многопоточного кода чрезвычайно сложно. Причина этого в том, что вы не можете контролировать время выполнения потоков.
Простое решение состоит в том, чтобы инициировать запросы (или что-то еще, что является процессом ваших потоков), а затем Thread.Sleep()
некоторое время в вашем модульном тесте и надеяться, что ваши потоки запланированы для выполнения работы. Затем проверьте, все ли правильно обработано. В основном это работает, но иногда не удается из-за планирования и синхронизации - особенно, когда вы запускаете свои модульные тесты на виртуальной машине. Вы также можете установить некоторые события или состояния в своих потоках, чтобы указать, что они прошли определенные этапы, но это может стать немного уродливым.
Однако, если вы можете быть более точным, что именно вы делаете, возможно, есть обходной путь, который работает лучше.