32

OK、これはマニュアルに記載されており、おそらくand/orと関係がある
ことは知っていますが、単純で直接的な例が非常に役立ちます。 side_effectreturn_value

私は持っている:

class ClassToPatch():
   def __init__(self, *args):
       _do_some_init_stuff()

   def some_func():
       _do_stuff()


class UUT():
    def __init__(self, *args)
       resource_1 = ClassToPatch()
       resource_2 = ClassToPatch()

UUTここで、クラスの単体テストを行い、 ClassToPatch. クラスUUTが正確に 2 つのClassToPatchオブジェクトをインスタンス化することがわかっているので、インスタンス化ごとに Mock フレームワークが新しい Mock オブジェクトを返すようにして、後でそれぞれの呼び出しを個別にアサートできるようにします。

@patchテストケースでデコレータを使用してこれを達成するにはどうすればよいですか? つまり、次のコード サンプルを修正するにはどうすればよいでしょうか。

class TestCase1(unittest.TestCase):

    @patch('classToPatch.ClassToPatch',autospec=True)
    def test_1(self,mock1,mock2):
        _assert_stuff()
4

2 に答える 2

37

これは、あなたが始めるための簡単な例です:

import mock
import unittest

class ClassToPatch():
   def __init__(self, *args):
       pass

   def some_func(self):
       return id(self)

class UUT():
    def __init__(self, *args):
        resource_1 = ClassToPatch()
        resource_2 = ClassToPatch()
        self.test_property = (resource_1.some_func(), resource_2.some_func())

class TestCase1(unittest.TestCase):
    @mock.patch('__main__.ClassToPatch', autospec = True)
    def test_1(self, mock1):
        ctpMocks = [mock.Mock(), mock.Mock()]
        ctpMocks[0].some_func.return_value = "funky"
        ctpMocks[1].some_func.return_value = "monkey"
        mock1.side_effect = ctpMocks

        u = UUT()
        self.assertEqual(u.test_property, ("funky", "monkey"))

if __name__ == '__main__':
    unittest.main()

test_property単体テストが何か役に立つように、UUT に追加しました。さて、モックがなければ、2 つのインスタンスtest_propertyの ID を含むタプルになるはずです。ClassToPatchしかし、モックでは、それはタプルでなければなりません: ("funky", "monkey").

モック オブジェクトのプロパティを使用して、イニシャライザの呼び出しごとside_effectに異なるインスタンスClassToPatchが返されるようにしました。UUT

お役に立てれば。

編集:ところで、単体テストを実行すると、次のようになります。

.
----------------------------------------------------------------------
Ran 1 test in 0.004s

OK
于 2012-05-25T09:25:52.760 に答える