Кажется вероятным, что исключение регистрируется, так как обработчик ошибок просто вызывает его.Я не совсем уверен, как выглядит код обработки ошибок в txrdq, так что это всего лишь предположение, но я думаю, что это довольно хороший пример, основанный на ваших наблюдениях.
Пробная версия не проходит ни одного модульного теста, который регистрируетисключение, если тест не очищает это исключение после его регистрации.Используйте TestCase.flushLoggedErrors(exceptionType)
, чтобы справиться с этим:
def test_txrdq(self):
self.queue.put("Some argument", 1)
self.assertEqual(1, len(self.flushLoggedErrors(SomeException)))
Также обратите внимание, что вы никогда не должны делать Failure("string")
.Это аналогично raise "string"
.Строковые исключения в Python устарели с давних времен.Всегда создавайте Failure
с экземпляром исключения:
class JobError(Exception):
pass
def aFailingJob(self, a):
return Failure(JobError("This is a failure"))
Это делает JobError
типом исключения, которое вы передадите flushLoggedErrors
.
Убедитесь, что вы понимаете, стоит ли очередьобработка синхронная или асинхронная.Если это синхронно, ваш тест (с добавленным вызовом flushLoggedErrors
) в порядке.Если он асинхронный, ваш обработчик ошибок может не запуститься к тому времени, когда ваш метод теста вернется.В этом случае вы не собираетесь тестировать что-либо полезное, и ошибки могут регистрироваться после вызова, чтобы сбросить их (делая сброс бесполезным).
Наконец, если вы не пишете модульные тесты'' 'для' '' txrdq, тогда вы можете не захотеть писать такие тесты.Вы можете, вероятно, выполнить модульное тестирование кода, использующего txrdq, без использования фактического txrdq.Обычный объект Queue (или, возможно, другой более специализированный двойной тест) позволит вам более точно нацеливать блоки в вашем приложении, делая ваши тесты быстрее, надежнее и проще для отладки.