Python은 return_value 대신 MagicMock 객체를 반환합니다.


93

나는 파이썬 파일이 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하여 수업 에서 unittest 하고 싶습니다 . 이를위한 파일의 내용은 다음과 같습니다 .BAtesta.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
테스트 할 때 클래스의 인스턴스가 아닌 from ( 다른 항목을 지정하지 않았으므로 일반 )을 A()반환합니다 . 당신은 설정해야합니다 정의 된 무언가가 될 . return_valuemock_AMagicMockAreturn_valuemethod_a
jonrsharpe

3
mock_a.method_a.return_value = '조롱 A'=> mock_a () method_a.return_value = '조롱 A'더해야합니다 :).
알리 SAID OMAR

@AliSAIDOMAR은 정확하게 정확 합니다. 자체 mock_a가 아니라 메서드가 있어야하는 호출의 반환 값입니다 mock_a.
jonrsharpe

1
@jonrsharpe. 설명해 주셔서 감사합니다. 방금 시도했습니다. 모두 mock_a().method_a.return_value = 'Mocked A'mock_a.return_value.method_a.return_value = 'Mocked A'일했다. 귀하의 의견에 감사드립니다. 계속해서 대답 해 주시겠습니까?
메디 Jafarnia Jahromi

트윗 담아 가기
Niakros

답변:


105

이 경우 테스트중인 코드 @mock.patch('a.A')의 클래스 Amock_a.

B.method_b 당신이 설정 한 다음 a = A()지금이다, a = mock_a()- 즉 a는 IS return_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()경우에 작동했을 것이고 , 그러면 모의 메서드를 트리거했을 것입니다.


4
대박. 당신은 내 하루를 만들었습니다.
Vishal

@jonrsharpe 안녕하세요, 저는 함께 팬더 dataframe을 사용하고 df.columns 내 확인하는 경우 조건을. 괄호를 사용하지 않습니다 (즉, 호출 할 수 없음). 이 경우 목록을 반환하려면 어떻게해야합니까? 감사!
imsrgadich

@imsrgadich 당신은 그것을 위해 모의 가 필요 합니까? 적절한 데이터 프레임을 구축하고 테스트 값으로 취급하십시오.
jonrsharpe

@jonrsharpe 그래, 나는 그것을 할 수 있지만 나는 또한 내가 주장 해야하는 호출 된 메서드에서 df.drop을 수행하고 있으며 호출 된 메서드에서 데이터 프레임을 다시 반환하지 않는다는 것을 알았습니다. 그것은 문제를 일으 킵니다. 나는 mock_data.configure_mock(columns='my_column')그것을 해결 하는 방법을 찾았 습니다. 그래도 답장을 보내 주셔서 감사합니다. (참조 : bradmontgomery.net/blog/how-world-do-you-mock-name-attribute )
imsrgadich

동일한 테스트에서 두 개의 SQLAlchemy 모델을 모의하면 작동하지 않는 것 같습니다. 첫 번째는 정상적으로 작동하지만 두 번째는 정의에 관계없이 MagicMock을 반환합니다.
Juha Untinen 2018 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.