1. ホーム
  2. python

[解決済み] Pythonはreturn_valueの代わりにMagicMockオブジェクトを返します。

2022-08-07 12:15:45

質問

私は python ファイル a.py というファイルがあり、そこには二つのクラス AB .

class A(object):
    def method_a(self):
        return "Class A method a"

class B(object):
    def method_b(self):
        a = A()
        print a.method_a()

ユニテストしたい method_b のクラスで B をモック化することで A . 以下は、ファイルの内容です。 testa.py をこの目的のために使用します。

import unittest
import mock
import a


class TestB(unittest.TestCase):

    @mock.patch('a.A')
    def test_method_b(self, mock_a):
        mock_a.method_a.return_value = 'Mocked A'
        b = a.B()
        b.method_b()


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

私が期待するのは Mocked A を出力することを期待します。しかし、私が得たものは

<MagicMock name='A().method_a()' id='4326621392'>

どこが悪いんだろう?

どうすればよいのでしょうか?

あなたが @mock.patch('a.A') とすると、クラス A を、テスト中のコードで mock_a .

B.method_b を設定すると a = A() となり、これが a = mock_a() - すなわち areturn_valuemock_a . この値を指定していないため、通常の MagicMock になります。これも設定されていませんので、デフォルトの応答 (さらに別の MagicMock ) が返されます。

代わりに return_valuemock_a のどちらかとして、適切なメソッドを持つようにします。

mock_a().method_a.return_value = 'Mocked A' 
    # ^ note parentheses

または、おそらくもっと明示的に

mock_a.return_value.method_a.return_value = 'Mocked A'

あなたのコードは、次のような場合に動作したことでしょう。 a = A (インスタンスの生成ではなくクラスの代入) の場合、次のようになります。 a.method_a() を実行するとモックメソッドが起動します。