私は模倣している次の簡略化されたクラスがあります:
_class myClass(object):
@staticmethod
def A():
#...
def check(self):
#code...
value = self.A()
#more code...
_
最初のテストでは、メソッドAのみを模擬しています
_from Django.test import TestCase
from mock import MagicMock
import myClass
class FirstTest(TestCase):
def setUp(self):
myClass.A = MagicMock(return_value = 'CPU')
def test(self):
#some tests
myClassObj = myClass()
myClassObj.check()
_
一方、2番目のテストでは、checkメソッド全体をモックします。
_from Django.test import TestCase
from mock import MagicMock
import myClass
class SecondTest(TestCase):
def setUp(self):
myClass.check = MagicMock(return_value = someObject)
def test(self):
#some tests
myClassObj = myClass()
myClassObj.check()
_
check()
を呼び出してA()
内でcheck()
をモックする代わりに、完全にモックされたcheck()
を呼び出すため、最初のテストからのアサーションは失敗します。私の2回目のテストから。
テスト後にメソッドをクリアして「通常」に設定する方法はありますか?私はすでにmyClass.check.reset_mock()
を試しましたが、何もしないようです。テストの順序を移動しても何も起こりません。
python from http://pypi.python.org/pypi/mock/ にモック1.0b1を使用しています
関数を自分に隠しておき、完了したら元に戻すことができます。
import unittest
from mock import MagicMock
from MyClass import MyClass
class FirstTest(unittest.TestCase):
def setUp(self):
self.A = MyClass.A
MyClass.A = MagicMock(name='mocked A', return_value='CPU')
def tearDown(self):
MyClass.A = self.A
def test_mocked_static_method(self):
print 'First Test'
print MyClass.check
print MyClass.A
class SecondTest(unittest.TestCase):
def setUp(self):
MyClass.check = MagicMock(name='mocked check', return_value=object)
def test_check_mocked_check_method(self):
print 'Second Test'
print MyClass.check
print MyClass.A
if __name__ == '__main__':
unittest.main()
このファイルを実行すると、次の出力が得られます。
First Test
<unbound method MyClass.check>
<MagicMock name='mocked A' id='141382732'>
Second Test
<MagicMock name='mocked check' id='141382860'>
<unbound method MyClass.A>
現在、パッチデコレータをsetUpやtearDownよりもはるかに多く使用しています。この場合、あなたは行うことができます
from mock import patch
@patch('MyClass.A')
def test_mocked_static_method(self, mocked_A)
mocked_A.return_value = 'CPU'
# This mock will expire when the test method is finished
mock.patch
は、デコレータまたはコンテキストマネージャとして使用できます。
from mock import patch, MagicMock
@patch('myClass.A', MagicMock(return_value='CPU'))
def test(self):
pass
または:
def test(self):
with patch('myClass.A', MagicMock(return_value='CPU')):
pass
モックオブジェクトをpatch
に指定しない場合、変更可能な自動指定されたモックが提供されます。
@patch('myClass.A')
def test(self, mock_A):
mock_A.return_value = 'CPU'
pass
または:
def test(self):
with patch('myClass.A') as mock_A:
mock_A.return_value = 'CPU'
pass
すべての場合において、装飾されたテスト関数またはコンテキストマネージャーが終了すると、元の値が復元されます。