2016-07-05 8 views
8

のMagicMockオブジェクトを返します。は、Pythonは、私は二つのクラス<code>A</code>と<code>B</code>が含まれているPythonのファイル<code>a.py</code>を持っている代わりに、RETURN_VALUE

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() 

私はAをあざけることにより、クラスBmethod_bをunittestのしたいと思います。ここでは、この目的のためにファイル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'> 

どこが間違っていますか?

+1

'A()'は、 'Aock'クラスのインスタンスではない' mock_A'(通常の 'MagicMock'、他に何も指定していないので)から' return_value'を返します。あなたは ''定義されmethod_a'を持っているものであることをreturn_value'ことを設定する必要があります。 – jonrsharpe

+1

mock_a.method_a.return_value = 'Mocked A' => mock_a()。method_a.return_value = 'Mocked A'はより良くなるはずです。 –

+0

@AliSAIDOMARは正確に正しいです、 'mock_a'を呼び出すときの戻り値です。メソッドであり、 'mock_a'自体ではありません。 – jonrsharpe

答えて

7

@mock.patch('a.A')の場合、テストコードのAクラスをmock_aに置き換えます。

B.method_bでは、その後、今a = mock_a()あるa = A()を、設定 - すなわちamock_areturn_valueです。この値を指定していないとして、それは通常のMagicMockです。これはどちらかに設定されていないので、上のメソッドを呼び出すときには、デフォルトの応答(さらに別のMagicMock)を取得します。

代わりに、あなたはどちらかとして行うことができ、適切な方法で、持っているmock_areturn_valueを設定したい:

おそらくより明確に
mock_a().method_a.return_value = 'Mocked A' 
    #^note parentheses 

または、:

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

あなたを次いでa.method_a()あなたのモックメソッドを引き起こしたであろうように、コードは、(、クラスを割り当てるインスタンスを作成しない)場合a = Aで働いているだろう。

関連する問題