source

Python이 return_value 대신 MagicMock 개체를 반환합니다.

gigabyte 2023. 7. 18. 22:56
반응형

Python이 return_value 대신 MagicMock 개체를 반환합니다.

파이썬 파일을 가지고 있습니다.a.py두 개의 클래스를 포함합니다.A그리고.B.

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()예를 들면a그것은return_valuemock_a이 값을 지정하지 않았기 때문에 정규 값입니다.MagicMock이것도 구성되지 않았으므로 기본 응답을 받습니다(또 다른 응답).MagicMock) 메서드를 호출할 때 사용합니다.

대신 다음 중 하나를 수행할 수 있는 적절한 방법을 사용하도록 구성할 수 있습니다.

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()당신의 모의 수법을 촉발시켰을 겁니다

객체를 조롱하는 경우 다음 구문을 사용합니다.

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

이 경우 method_a는 람다 함수에 의해 조롱됩니다.

저의 경우, 저의 return_value는 다음과 같습니다.{"key1": "value1"}그래서 저는 이것을 캐스팅할 필요가 있었습니다.dict()패치를 적용하기 전에.

다음과 같이:

@fixture
def mock_something(mocker: MockFixture, request: SubRequest) -> MagicMock:
    method_to_mock = f"your_module.YourClass.some_method"
    return_value = dict(request.param)
    if isinstance(return_value, Exception):
        return mocker.patch(method_to_mock, side_effect=return_value)
    return mocker.patch(method_to_mock, return_value=return_value)

언급URL : https://stackoverflow.com/questions/38199008/python-returns-magicmock-object-instead-of-return-value

반응형