def _print_message(self, message, file=None):
if message:
- if file is None:
- file = _sys.stderr
- file.write(message)
+ file = file or _sys.stderr
+ try:
+ file.write(message)
+ except (AttributeError, OSError):
+ pass
# ===============
# Exiting methods
# Author: Steven J. Bethard <steven.bethard@gmail.com>.
+import contextlib
+import functools
import inspect
import io
import operator
return self.buffer.raw.getvalue().decode('utf-8')
+class StdStreamTest(unittest.TestCase):
+
+ def test_skip_invalid_stderr(self):
+ parser = argparse.ArgumentParser()
+ with (
+ contextlib.redirect_stderr(None),
+ mock.patch('argparse._sys.exit')
+ ):
+ parser.exit(status=0, message='foo')
+
+ def test_skip_invalid_stdout(self):
+ parser = argparse.ArgumentParser()
+ for func in (
+ parser.print_usage,
+ parser.print_help,
+ functools.partial(parser.parse_args, ['-h'])
+ ):
+ with (
+ self.subTest(func=func),
+ contextlib.redirect_stdout(None),
+ # argparse uses stderr as a fallback
+ StdIOBuffer() as mocked_stderr,
+ contextlib.redirect_stderr(mocked_stderr),
+ mock.patch('argparse._sys.exit'),
+ ):
+ func()
+ self.assertRegex(mocked_stderr.getvalue(), r'usage:')
+
+
class TestCase(unittest.TestCase):
def setUp(self):