web-dev-qa-db-ja.com

モックされたメソッドを元の状態にリセットする方法はありますか? -Pythonモック-モック1.0b1

私は模倣している次の簡略化されたクラスがあります:

_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を使用しています

32
SaiyanGirl

関数を自分に隠しておき、完了したら元に戻すことができます。

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
13
aychedee

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

すべての場合において、装飾されたテスト関数またはコンテキストマネージャーが終了すると、元の値が復元されます。

36
ecatmur