python의 mockpatch.object를 사용하여 다른 메서드 내에서 호출된 메서드의 반환 값 변경
내가 테스트하려는 다른 함수 내에서 호출된 함수의 반환 값을 모의 실험할 수 있습니까?저는 조롱된 방법(제가 테스트하는 많은 방법으로 호출됨)이 호출될 때마다 지정된 변수를 반환하기를 원합니다.예:
class Foo:
def method_1():
results = uses_some_other_method()
def method_n():
results = uses_some_other_method()
단위 테스트에서는 mock을 사용하여 반환 값을 변경하고 싶습니다.uses_some_other_method()
언제든지 호출될 수 있도록.Foo
내가 정의한 것을 반환합니다.@patch.object(...)
이렇게 할 수 있는 방법은 패치와 patch.object의 두 가지입니다.
패치는 사용자가 개체를 직접 가져오는 것이 아니라 테스트 중인 개체에서 사용하고 있다고 가정합니다.
#foo.py
def some_fn():
return 'some_fn'
class Foo(object):
def method_1(self):
return some_fn()
#bar.py
import foo
class Bar(object):
def method_2(self):
tmp = foo.Foo()
return tmp.method_1()
#test_case_1.py
import bar
from mock import patch
@patch('foo.some_fn')
def test_bar(mock_some_fn):
mock_some_fn.return_value = 'test-val-1'
tmp = bar.Bar()
assert tmp.method_2() == 'test-val-1'
mock_some_fn.return_value = 'test-val-2'
assert tmp.method_2() == 'test-val-2'
테스트할 모듈을 직접 가져오는 경우 다음과 같이 patch.object를 사용할 수 있습니다.
#test_case_2.py
import foo
from mock import patch
@patch.object(foo, 'some_fn')
def test_foo(test_some_fn):
test_some_fn.return_value = 'test-val-1'
tmp = foo.Foo()
assert tmp.method_1() == 'test-val-1'
test_some_fn.return_value = 'test-val-2'
assert tmp.method_1() == 'test-val-2'
두 경우 모두 테스트 기능이 완료된 후 일부_fn은 '모킹 해제'됩니다.
편집: 여러 함수를 모의하려면 함수에 더 많은 장식자를 추가하고 추가 매개 변수를 사용할 인수를 추가하면 됩니다.
@patch.object(foo, 'some_fn')
@patch.object(foo, 'other_fn')
def test_foo(test_other_fn, test_some_fn):
...
장식기가 함수 정의에 가까울수록 모수 리스트에 일찍 포함됩니다.
이 작업은 다음과 같은 방법으로 수행할 수 있습니다.
# foo.py
class Foo:
def method_1():
results = uses_some_other_method()
# testing.py
from mock import patch
@patch('Foo.uses_some_other_method', return_value="specific_value"):
def test_some_other_method(mock_some_other_method):
foo = Foo()
the_value = foo.method_1()
assert the_value == "specific_value"
다음은 잘못된 위치에서 패치 적용을 참조할 수 있는 소스입니다.
고객님이 말씀하신 내용을 명확히 말씀드리겠습니다. 고객님은 테스트를 원하십니다.Foo
테스트 케이스에서 외부 방법을 호출합니다.uses_some_other_method
실제 메소드를 호출하는 대신 반환 값을 모의실험하려고 합니다.
class Foo:
def method_1():
results = uses_some_other_method()
def method_n():
results = uses_some_other_method()
위의 코드가 다음과 같다고 가정합니다.foo.py
그리고.uses_some_other_method
모듈에 정의되어 있습니다.bar.py
다음은 유닛 테스트입니다.
import unittest
import mock
from foo import Foo
class TestFoo(unittest.TestCase):
def setup(self):
self.foo = Foo()
@mock.patch('foo.uses_some_other_method')
def test_method_1(self, mock_method):
mock_method.return_value = 3
self.foo.method_1(*args, **kwargs)
mock_method.assert_called_with(*args, **kwargs)
다른 인수로 전달할 때마다 반환 값을 변경하려면,mock
를 제공합니다.
유용한 실피드의 답변에 추가하기 위해, 저는 문제의 객체에 대한 여러 가지 방법을 패치해야 했습니다.저는 이런 식으로 하는 것이 더 우아하다고 생각했습니다.
테스트할 다음 기능이 주어지면, 위치는module.a_function.to_test.py
:
from some_other.module import SomeOtherClass
def add_results():
my_object = SomeOtherClass('some_contextual_parameters')
result_a = my_object.method_a()
result_b = my_object.method_b()
return result_a + result_b
이 함수(또는 클래스 메소드)를 테스트하려면 클래스의 여러 메소드를 패치할 수 있습니다.SomeOtherClass
을 이용하여patch.object()
와 결합하여sys.modules
:
@patch.object(sys.modules['module.a_function.to_test'], 'SomeOtherClass')
def test__should_add_results(self, mocked_other_class):
mocked_other_class().method_a.return_value = 4
mocked_other_class().method_b.return_value = 7
self.assertEqual(add_results(), 11)
이것은 다음의 방법의 수에 상관없이 작동합니다.SomeOtherClass
독립적인 결과를 통해 패치를 적용해야 합니다.
또한, 동일한 패치 적용 방법을 사용하면 실제 인스턴스가SomeOtherClass
필요한 경우 다음과 같이 반환할 수 있습니다.
@patch.object(sys.modules['module.a_function.to_test'], 'SomeOtherClass')
def test__should_add_results(self, mocked_other_class):
other_class_instance = SomeOtherClass('some_controlled_parameters')
mocked_other_class.return_value = other_class_instance
...
언급URL : https://stackoverflow.com/questions/18191275/using-pythons-mock-patch-object-to-change-the-return-value-of-a-method-called-w
'programing' 카테고리의 다른 글
'%query2%'와 같은 필드1이 아닌 곳을 선택하는 방법 (0) | 2023.08.28 |
---|---|
실행 중인 도커 컨테이너로 mysql 가져오기가 작동하지 않음 (0) | 2023.08.28 |
MariaDB Encryption의 가장 좋은 방법은 무엇입니까? (0) | 2023.08.28 |
텍스트 깜박임 jQuery (0) | 2023.08.28 |
Spring MVC 애플리케이션에서 서비스 계층에 사용하는 명명 규칙은 무엇입니까? (0) | 2023.08.28 |