title: Python - Mocking OS Error Exception
body: <p>Trying to mock a PermissionError exception in Python 3.6 using side_effect.  Looks like my function is called and the EPERM exception is raised, but then it fails to run my except statements.  Same code runs as expected for a 'real' OSError exception.  My code:</p>
  
  <pre><code>#my_module.py
  import os
  import errno  
  import sys
  import inspect
  
  def open_file(fname):
      try:
          with open('./' + fname, 'w') as f:
              print('never get here')
          return(0)
  
      except PermissionError as e:
          print('ERROR: \nIn function: ' + inspect.stack()[0][3])
          print('On line: {}'.format(sys.exc_info()[-1].tb_lineno), type(e).__name__, e)
          sys.exit(1)
  </code></pre>
  
  <p>My test:</p>
  
  <pre><code>#OpenFileMockTestCase.py
  from unittest import TestCase
  from unittest import mock
  import errno
  import my_module
  
  class OpenFileMockTestCase(TestCase):
  
      @mock.patch('my_module.os.open')
      def test_2_open_file_mock_oserror(self, mock_oserror):
          with self.assertRaises(SystemExit):
              mock_oserror.my_module.open_file.side_effect = (OSError((errno.EPERM), 'Not Allowed'))
              print('starting open_file with testfile2.txt...')
              mock_oserror.my_module.open_file('testfile2.txt')
  </code></pre>
  
  <p>When I run:</p>
  
  <pre><code>C:\Users\mylib&gt;coverage3 run -m unittest OpenFileMockTestCase.py -v
  test_2_open_file_mock_oserror (OpenFileMockTestCase.OpenFileMockTestCase) ... starting open_file with testfile2.txt...
  
  ERROR
  
  ======================================================================
  ERROR: test_2_open_file_mock_oserror (OpenFileMockTestCase.OpenFileMockTestCase)
  ----------------------------------------------------------------------
  Traceback (most recent call last):
    File "c:\users\xti027\appdata\local\programs\python\python36\lib\unittest\mock.py", line 1179, in patched
      return func(*args, **keywargs)
    File "C:\Users\xti027\Documents\DataTool-Git\DataTool\DataLoaderConfig\OpenFileMockTestCase.py", line 14, in test_2_open_file_mock_oserror
      mock_oserror.my_module.open_file('testfile2.txt')
    File "c:\users\xti027\appdata\local\programs\python\python36\lib\unittest\mock.py", line 939, in __call__
      return _mock_self._mock_call(*args, **kwargs)
    File "c:\users\xti027\appdata\local\programs\python\python36\lib\unittest\mock.py", line 995, in _mock_call
      raise effect
  PermissionError: [Errno 1] Not Allowed
  
  ----------------------------------------------------------------------
  Ran 1 test in 0.031s
  
  FAILED (errors=1)
  </code></pre>
  
  <p>I have read several SO questions and responses on Exceptions and mocking like <a href="https://stackoverflow.com/questions/23947312/how-do-i-write-a-unit-test-for-oserror">How do I write a unit test for OSError?</a> and looked at the Python doc: <a href="https://docs.python.org/3.6/library/unittest.mock.html#module-unittest.mock" rel="nofollow noreferrer">https://docs.python.org/3.6/library/unittest.mock.html#module-unittest.mock</a>
  Am I mocking the right item at the right place?  </p>