web-dev-qa-db-ja.com

親クラスの__init__メソッドのモック

別のクラスから派生したクラスでいくつかの単体テストを作成しようとしていますが、親クラスのinitメソッドをモックするのが難しいため、これはできません。提案を探しています。

これが私のクラスの例です

Imported.py

class Imported():
    def __init__(self, a="I am Imported"):
        print("a:{}".format(a))

Parent.py

from Imported import Imported

class Parent(object):

    parent_list = ["PARENT"]

    def __init__(self, a="I am Parent"):
        imported = Imported(a)

Derived.py

from Parent import Parent

class Derived(Parent):

    Parent.parent_list.append("DERIVED")

単体テストで、DerivedクラスのオブジェクトDerived()をインスタンス化するときに、Parent.parent_list == ["PARENT"、 "DERIVED"]であることを確認したいと思います。

このソリューションはどちらも機能しません

test_Derived.py

import unittest
from mock import patch

from Derived import Derived


class test_Derived(unittest.TestCase):

    @patch("Derived.Parent.__init__")
    def test_init_001(self, mock_parent_init):
        a = Derived("I am Derived")
        mock_parent_init.assert_called_with("I am Derived")
        self.assertEquals(a.parent_list, ["PARENT", "DERIVED"])

    @patch("Derived.Imported.Imported")
    def test_init_002(self, mock_parent_init):
        a = Derived("I am Derived")
        mock_parent_init.assert_called_with("I am Derived")
        self.assertEquals(a.parent_list, ["PARENT", "DERIVED"])

test_init_001が失敗する

TypeError: __init__() should return None, not 'MagicMock'

test_init_002が失敗する

ImportError: No module named Parent.Imported

なにか提案を?

14
user2944566

最初のソリューションでは、__init__メソッドの戻り値をNoneに変更します。

@patch("Derived.Parent.__init__")
def test_init_001(self, mock_parent_init):
    mock_parent_init.return_value = None  # <---
    a = Derived("I am Derived")
    mock_parent_init.assert_called_with("I am Derived")
    self.assertEquals(a.parent_list, ["PARENT", "DERIVED"])

2番目のソリューションでは、パッチParent.Imported

@patch("Parent.Imported")  # <---
def test_init_002(self, mock_parent_init):
    a = Derived("I am Derived")
    mock_parent_init.assert_called_with("I am Derived")
    self.assertEquals(a.parent_list, ["PARENT", "DERIVED"])
23
falsetru