Поэтому я пытаюсь написать модульные тесты для моего использования nagiosplugin. Однако мне не удается захватить вывод stdout, сгенерированный этим плагином.
Вот мой очень простой маленький тест:
def test_check(mocker, capsys):
mocker.patch('sys.exit')
lc = nagios.LogCheck(EXPORTIT_LOG)
lc.main()
captured = capsys.readouterr()
print captured
А вот и вывод:
test_nagios.py::test_check LOGRESOURCE CRITICAL - Failed. | last_entry_runtime=19.871235s;300;600 since_last_entry=7296.123125s;600;1200
CaptureResult(out=u'', err=u'')
PASSED
Как вы можете сказать, выход не получен, хотя он генерируется.
Я полагаю, что это связано с этой частью кода в nagiosplugin:
(источник: https://bitbucket.org/flyingcircus/nagiosplugin/src/default/src/nagiosplugin/runtime.py)
class Runtime(object):
stdout = sys.stdout
def execute(self, check, verbose=None, timeout=None):
print('{0}'.format(self.output), end='', file=self.stdout)
self.sysexit()
Я обрезал большую его часть, но проблема, похоже, заключается в том, что объект хранит sys.stdout как self.stdout , а затем использует его для генерировать вывод. Это, кажется, полностью обходит захват, сделанный pytest. Краткая сессия отладки, казалось, подтвердила это подозрение: сразу после оператора печати self.stdout является обычным sys.stdout , тогда как фактический sys.stdout является заменой захвата от pytest.
Кто-нибудь когда-нибудь сталкивался с этой проблемой (или чем-то подобным) раньше? Как ты это решил?