Assert that a method was called in a Python unit test

后端 未结 5 1205
不思量自难忘°
不思量自难忘° 2020-12-04 15:14

Suppose I have the following code in a Python unit test:

aw = aps.Request(\"nv1\")
aw2 = aps.Request(\"nv2\", aw)

Is there an easy way to a

5条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-04 15:38

    I use Mock (which is now unittest.mock on py3.3+) for this:

    from mock import patch
    from PyQt4 import Qt
    
    
    @patch.object(Qt.QMessageBox, 'aboutQt')
    def testShowAboutQt(self, mock):
        self.win.actionAboutQt.trigger()
        self.assertTrue(mock.called)
    

    For your case, it could look like this:

    import mock
    from mock import patch
    
    
    def testClearWasCalled(self):
       aw = aps.Request("nv1")
       with patch.object(aw, 'Clear') as mock:
           aw2 = aps.Request("nv2", aw)
    
       mock.assert_called_with(42) # or mock.assert_called_once_with(42)
    

    Mock supports quite a few useful features, including ways to patch an object or module, as well as checking that the right thing was called, etc etc.

    Caveat emptor! (Buyer beware!)

    If you mistype assert_called_with (to assert_called_once or assert_called_wiht) your test may still run, as Mock will think this is a mocked function and happily go along, unless you use autospec=true. For more info read assert_called_once: Threat or Menace.

提交回复
热议问题