1. ホーム
  2. python

[解決済み] Python のユニットテストでメソッドが呼び出されたことを表明する

2022-09-27 14:01:28

質問

Pythonのユニットテストに以下のようなコードがあるとします。

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

特定のメソッド(私の場合は aw.Clear() ) がテストの2行目の間に呼び出されたことを保証する簡単な方法はありますか? 例えば、このようなものがありますでしょうか。

#pseudocode:
assertMethodIsCalled(aw.Clear, lambda: aps.Request("nv2", aw))

どのように解決するのですか?

私は モック (これは現在 unittest.mock になりました)。

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)

あなたの場合、次のようになります。

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は、オブジェクトやモジュールにパッチを当てる方法や、正しいものが呼び出されたかどうかをチェックする方法など、非常に多くの便利な機能をサポートしています。

注意! (買い手はご用心!)

タイプミスをした場合 assert_called_with (になります。 assert_called_once または assert_called_wiht を使用しない限り、モックはこれをモックされた関数とみなして喜んで実行するので、テストはまだ実行されるかもしれません。 autospec=true . より詳しい情報は assert_called_once: 脅威か威嚇か .