입력 인수를 기반으로 한 모의 python 함수
Python에는 Mock을 사용한지 꽤 되었습니다.
지금 우리는 함수를 조롱하고 싶은 상황이 있다.
def foo(self, my_param):
#do something here, assign something to my_result
return my_result
일반적으로 이를 조롱하는 방법은 (foo가 객체의 일부라고 가정)입니다.
self.foo = MagicMock(return_value="mocked!")
foo()를 몇 번 호출해도 사용할 수 있습니다.
self.foo = MagicMock(side_effect=["mocked once", "mocked twice!"])
지금은 입력 파라미터에 특정 값이 있을 때 고정값을 반환하고 싶은 상황에 처해 있습니다."my_param"이 "something"과 같다면 "my_cool_mock"을 반환합니다.
python용 mockito에서 사용할 수 있는 것 같습니다.
when(dummy).foo("something").thenReturn("my_cool_mock")
어떻게 하면 모크와 같은 목표를 달성할 수 있을지 계속 찾고 있었지만 성공하지 못했다.
좋은 생각 있어요?
한다면
side_effect_func
있나 어떤 기능은 기능에는 모의한 데는 점이다.그side_effect_func
기능 모의 고사와 같은 논거로 불린다.이 동적으로 당신, 입력 정보에 따라 호출의 반환 값을 변경할:허용한다.>>> def side_effect_func(value): ... return value + 1 ... >>> m = MagicMock(side_effect=side_effect_func) >>> m(1) 2 >>> m(2) 3 >>> m.mock_calls [call(1), call(2)]
http://www.voidspace.org.uk/python/mock/mock.html#calling
여러 번 호출된 메서드의 Python Mock 객체에 표시된 바와 같이
해결책은 나만의 부작용을 쓰는 것이다.
def my_side_effect(*args, **kwargs):
if args[0] == 42:
return "Called with 42"
elif args[0] == 43:
return "Called with 43"
elif kwargs['foo'] == 7:
return "Foo is seven"
mockobj.mockmethod.side_effect = my_side_effect
그게 핵심이야
부작용에는 함수(람다 함수일 수도 있음)가 사용되므로 간단한 경우 다음을 사용할 수 있습니다.
m = MagicMock(side_effect=(lambda x: x+1))
만약 당신이"입력 매개 변수는 특정 값이 고정된 값을 반환하고 싶",시면과 a사용할 수 있는 모의 필요가 없dict
그와 함께get
메서드
foo = {'input1': 'value1', 'input2': 'value2'}.get
foo('input1') # value1
foo('input2') # value2
입력할 때 가짜의 출력은 매핑에 특히 유용합니다.입력의 내가 사용하는 게 좋을 거면 알려 주는 기능이다.side_effect
앰버의 대답 한번에.
만약 당신이 지키고 싶으면 너는 또한 이 둘의 조합 사용할 수 있다.Mock
기능(assert_called_once
,call_count
등):
self.mock.side_effect = {'input1': 'value1', 'input2': 'value2'}.get
여기서 "입력 인수에 기초한 함수 모킹 방법"을 찾았고, 마침내 간단한 보조 함수를 만드는 방법을 해결했습니다.
def mock_responses(responses, default_response=None):
return lambda input: responses[input] if input in responses else default_response
지금:
my_mock.foo.side_effect = mock_responses(
{
'x': 42,
'y': [1,2,3]
})
my_mock.goo.side_effect = mock_responses(
{
'hello': 'world'
},
default_response='hi')
...
my_mock.foo('x') # => 42
my_mock.foo('y') # => [1,2,3]
my_mock.foo('unknown') # => None
my_mock.goo('hello') # => 'world'
my_mock.goo('ey') # => 'hi'
이것이 누군가에게 도움이 되기를 바랍니다!
비록 ~일지라도side_effect
이 목표를 달성할 수 있을까, 그렇게 설정으로 편리하지 않다.side_effect
각 시험 케이스용 기능.
이 문제에 대처하기 위해 내장 모크를 강화하기 위해 경량 모크(NextMock)를 작성합니다.다음은 간단한 예입니다.
from nextmock import Mock
m = Mock()
m.with_args(1, 2, 3).returns(123)
assert m(1, 2, 3) == 123
assert m(3, 2, 1) != 123
인수 매처도 지원합니다.
from nextmock import Arg, Mock
m = Mock()
m.with_args(1, 2, Arg.Any).returns(123)
assert m(1, 2, 1) == 123
assert m(1, 2, "123") == 123
이 패키지로 테스트를 더 즐겁게 할 수 있기를 바랍니다.어떤 피드백이라도 자유롭게 해 주세요.
또한을 사용할 수도 있습니다 사용할 수 있다.partial
부터에서functools
、 롱능: 、 ::: e e e 、 롱: e e e e 。§:
def mock_year(year):
return datetime.datetime(year, 11, 28, tzinfo=timezone.utc)
@patch('django.utils.timezone.now', side_effect=partial(mock_year, year=2020))
그러면 파라미터(Django의 timezone.now() 등)를 수신할 수 없지만 mock_year 함수는 수신할 수 있는 콜 가능이 반환됩니다.
다른 방법을 보여 주기 위해:
def mock_isdir(path):
return path in ['/var/log', '/var/log/apache2', '/var/log/tomcat']
with mock.patch('os.path.isdir') as os_path_isdir:
os_path_isdir.side_effect = mock_isdir
이 경우에도 하실 수 있습니다.@mock.patch.object
:
이라고 해 볼까요?my_module.py
pandas
하려면 , 「데이터베이스로부터 .」를 조롱합니다.pd.read_sql_table
메서드를 사용하는 )table_name
( 로た )
해서 할 수 있는 것은 에) 수 있는 입니다.db_mock
지정된 인수에 따라 다른 개체를 반환하는 메서드:
def db_mock(**kwargs):
if kwargs['table_name'] == 'table_1':
# return some DataFrame
elif kwargs['table_name'] == 'table_2':
# return some other DataFrame
테스트 기능에서는 다음 작업을 수행합니다.
import my_module as my_module_imported
@mock.patch.object(my_module_imported.pd, "read_sql_table", new_callable=lambda: db_mock)
def test_my_module(mock_read_sql_table):
# You can now test any methods from `my_module`, e.g. `foo` and any call this
# method does to `read_sql_table` will be mocked by `db_mock`, e.g.
ret = my_module_imported.foo(table_name='table_1')
# `ret` is some DataFrame returned by `db_mock`
언급URL : https://stackoverflow.com/questions/16162015/mocking-python-function-based-on-input-arguments
'itsource' 카테고리의 다른 글
SQL: 인접 노드를 유향 그래프로 쿼리합니다. (0) | 2022.09.18 |
---|---|
HashMap Java 8 구현 (0) | 2022.09.18 |
Ruby on Rails 모델이 프리로드에 대해 인식되지 않습니까? (0) | 2022.09.18 |
MySQL 외부 키를 사용하여 테이블을 만드는 중 오류 없음: 150 (0) | 2022.09.17 |
내 항아리의 명세서 읽기 (0) | 2022.09.17 |