Can't catch mocked exception because it doesn't inherit BaseException

后端 未结 6 1672
无人共我
无人共我 2020-12-09 02:35

I\'m working on a project that involves connecting to a remote server, waiting for a response, and then performing actions based on that response. We catch a couple of diff

6条回答
  •  旧时难觅i
    2020-12-09 03:02

    I just ran into the same issue while trying to mock sqlite3 (and found this post while looking for solutions).

    What Serge said is correct:

    TL/DR: as you mock the full requests package, the except requests.exceptions.ConnectionError clause tries to catch a mock. As the mock is not really a BaseException, it causes the error.

    The only solution I can imagine is not to mock the full requests but only the parts that are not exceptions. I must admit I could not find how to say to mock mock everything except this

    My solution was to mock the entire module, then set the mock attribute for the exception to be equal to the exception in the real class, effectively "un-mocking" the exception. For example, in my case:

    @mock.patch(MyClass.sqlite3)
    def test_connect_fail(self, mock_sqlite3):
        mock_sqlite3.connect.side_effect = sqlite3.OperationalError()
        mock_sqlite3.OperationalError = sqlite3.OperationalError
        self.assertRaises(sqlite3.OperationalError, MyClass, self.db_filename)
    

    For requests, you could assign exceptions individually like this:

        mock_requests.exceptions.ConnectionError = requests.exceptions.ConnectionError
    

    or do it for all of the requests exceptions like this:

        mock_requests.exceptions = requests.exceptions
    

    I don't know if this is the "right" way to do it, but so far it seems to work for me without any issue.

提交回复
热议问题