2016-07-05 4 views
8

AB의 두 클래스를 포함하는 파이썬 파일 a.py이 있습니다.파이썬은 return_value 대신 MagicMock 객체를 반환합니다.

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을 조롱에 의해 클래스 B에서 method_b을 유닛 테스트하고 싶습니다. 다음은이 목적을 위해 파일 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()'는'mock_A' ('Mick_A')에서'return_value'를 리턴합니다. 'return_value'를 정의 된'method_a'가있는 것으로 설정해야합니다. – jonrsharpe

+1

mock_a.method_a.return_value = 'Mocked A'=> mock_a(). method_a.return_value = '조롱 된 A'는 더 좋아야합니다. :) –

+0

@AliSAIDOMAR은 정확합니다. 'mock_a'를 호출했을 때의 반환 값입니다. 'mock_a '자체가 아니다. – jonrsharpe

답변

7

@mock.patch('a.A') 일 때 테스트중인 코드에서 A 클래스를 mock_a으로 바꿉니다. 즉 amock_areturn_value입니다 -

B.method_b 당신은 지금 a = mock_a()a = A()을 설정합니다. 이 값을 지정하지 않았으므로 일반 MagicMock입니다. 이것은 구성되어 있지 않으므로 메소드를 호출 할 때 기본 응답 (또 다른 MagicMock)을 얻습니다. 아마도 더 명시 적으로

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

또는 :

대신, 당신은 당신이 중 하나로서 할 수있는 적절한 방법, 가지고 return_valuemock_a으로 구성 할

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

당신의 코드 a = A (클래스를 지정하고 인스턴스를 만들지 않음)에서 코드가 작동 했으므로 a.method_a()이 모의 메서드를 트리거했을 것입니다.

관련 문제