2013-05-24 3 views
4

자식 모의 객체 인스턴스의 부모 객체 MagicMock 모의 객체 인스턴스 또는 모의 객체 인스턴스의 부모 객체를 식별 할 수 있습니까? 예를 들어, 내가부모의 자식 모의 객체를 찾는다.

>>> from unittest.mock import MagicMock 
>>> parent_mock = MagicMock() 
>>> child_mock1 = parent_mock(a=1) 
>>> child_mock2 = parent_mock(b='spam') 

가 어떻게 아이가 parent_mock를 호출 양산 조롱 것을 나중에 확인할 수있는 다음과 같은 코드가 있다면? parent_mock 가짜 객체를 어떻게 확인할 수 있습니까? 또한

, 내가 child_mock2 통화 parent_mock(b='spam')에서 유래 동안 child_mock1가 호출 parent_mock(a=1)에서 특별히 유래 구별 수있는 방법?

나는 그러나, 그것은 당신이 지정된 아이가 조롱 반환하도록 명시 적으로 부모 모의의 반환 호출을 정의해야 할 필요가 있다는 점에서 설정의 좋은 거래를 필요로하고, 그래서 아무튼, 하나 manually attach mocks as attributes of other mocks 수 이해 몇 번의 전화를 거쳐야 스케일이 잘 나옵니다.

+0

아마 이런 식으로하고 싶지 않을 것입니다. 상속 계층 구조에 대해 걱정할 필요가 없습니다. 왜 그걸 알고 싶니? 아마도 실제 문제를 해결할 다른 방법이있을 것입니다. – erikbwork

+2

@ erikb85 "parent"및 "child"는 "superclass"및 "subclass"를 의미하지 않습니다. 'Mock' 인스턴스는 호출 될 때 "child"인스턴스를 반환합니다 (기본값). 다른 것을 만든 Mock 인스턴스를 "부모"라고합니다. – gotgenes

+0

질문에 대답하지 않는 사람.:) – erikbwork

답변

1

나중에 어린이 모의가 parent_mock 전화에서 발생했는지 어떻게 확인할 수 있습니까?

음 '이 ...이처럼 사용할 수있는 문서화되지 않은 속성 _mock_new_parent,의

>>> from unittest.mock import MagicMock 
>>> parent_mock = MagicMock() 
>>> child_mock1 = parent_mock(a=1) 
>>> child_mock2 = parent_mock(b='spam') 
>>> child_mock1._mock_new_parent is parent_mock 
True 
>>> child_mock2._mock_new_parent is parent_mock 
True 

...하지만 다른 모든 질문에 대한 대답은 당신이 할 수있는 "인 것처럼 보인다 티". 이

class MyMock(MagicMock): 

    def __init__(self, *args, **kwargs): 
     MagicMock.__init__(self, *args, **kwargs) 
     self._kids = [] 

    def __call__(self, *args, **kwargs): 
     result = MagicMock.__call__(self, *args, **kwargs) 
     self._kids.append((args, kwargs, result)) 
     return result 

... 당신이 할 수있는 당신이 이런 일에 그 아이를 추적 할 MagicMock 하위 클래스 수도있을 것 같군요

...

>>> parent_mock = MyMock() 
>>> child_mock1 = parent_mock(a=1) 
>>> child_mock2 = parent_mock(b='spam') 
>>> parent_mock._kids 
[((), {'a': 1}, <MyMock name='mock()' id='140358357513616'>), 
((), {'b': 'spam'}, <MyMock name='mock()' id='140358357513616'>)] 
>>> parent_mock._kids[0][2] is child_mock1 
True 
>>> parent_mock._kids[1][2] is child_mock2 
True 
+0

'MyMock'은 여전히'child_mock1 is child_mock2'을 가지고 있습니다. 다른 호출에 대해 다른 객체를 생성하지 않을'MagicMock .__ call__'을 위임했기 때문입니다. 어떤 전화가 왔는지 구별 할 수 없습니다. – user2357112

1

주의!

26.4.2.1. Calling

모의 객체를 호출 할 수 있습니다. 호출은 return_value 속성으로 설정된 값을 리턴합니다. 기본 반환 값은 새로운 Mock 객체입니다. 반환 값에 처음 액세스 할 때 (명시 적으로 또는 모의 호출을 통해) 생성되지만 때마다 이 반환됩니다. 서로 다른 통화가 다른 결과를 제공 할 경우

, 당신은 당신의 모의 side_effect 속성을 부여 할 수 있습니다. mock.side_effect이 함수 인 경우 mock(*args, **kwargs)mock.side_effect(*args, **kwargs)을 호출하고 반환되는 값을 반환합니다. mock.side_effect은 어떤 호출이 어떤 값을 생성했는지 추적 할 수 있습니다.

+0

문서의 해당 부분을 놓치 셨습니다. 감사합니다! @Aya의 구현처럼 보이며'MagicMock' 서브 클래스와'__call__' 오버라이드는 실제로 다른 모의 인스턴스를 반환합니다. – gotgenes

+0

아야의 구현이 작동하지 않습니다. 'MagicMock .__ call__'에 위임합니다. 항상 동일한 객체를 반환합니다. 즉,'child_mock1은 child_mock2'입니다. – user2357112

관련 문제