파이썬 mock.patch를 사용하고 있으며 각 호출의 반환 값을 변경하고 싶습니다. 주의 사항은 다음과 같습니다. 패치되는 함수에는 입력이 없으므로 입력을 기반으로 반환 값을 변경할 수 없습니다.
다음은 참조 용 코드입니다.
def get_boolean_response():
response = io.prompt('y/n').lower()
while response not in ('y', 'n', 'yes', 'no'):
io.echo('Not a valid input. Try again'])
response = io.prompt('y/n').lower()
return response in ('y', 'yes')
내 테스트 코드 :
@mock.patch('io')
def test_get_boolean_response(self, mock_io):
#setup
mock_io.prompt.return_value = ['x','y']
result = operations.get_boolean_response()
#test
self.assertTrue(result)
self.assertEqual(mock_io.prompt.call_count, 2)
io.prompt
“입력”의 플랫폼 독립적 (파이썬 2 및 3) 버전입니다. 그래서 궁극적으로 사용자 입력을 조롱하려고합니다. 반환 값 목록을 사용해 보았지만 작동하지 않습니다.
반환 값이 잘못된 경우 여기에서 무한 루프를 얻습니다. 결과적으로 테스트가 실제로 완료되도록 반환 값을 변경하는 방법이 필요합니다.
(이 질문에 대답하는 또 다른 방법은 단위 테스트에서 사용자 입력을 모방하는 방법을 설명하는 것입니다)
아니 DUP 이 질문에 내가 입력을 변화 할 수있는 능력이 없어 주로 때문입니다.
이 질문 에 대한 답변의 의견 중 하나는 같은 줄에 있지만 답변 / 댓글은 제공되지 않았습니다.
답변
에 iterable 을 할당 할 수 side_effect
있으며, mock은 호출 될 때마다 시퀀스의 다음 값을 반환합니다.
>>> from unittest.mock import Mock
>>> m = Mock()
>>> m.side_effect = ['foo', 'bar', 'baz']
>>> m()
'foo'
>>> m()
'bar'
>>> m()
'baz'
Mock()
문서 인용 :
side_effect 가 iterable 인 경우 mock 에 대한 각 호출은 iterable에서 다음 값을 반환합니다.
따로, 테스트 response is not 'y' or 'n' or 'yes' or 'no'
는 작동 하지 않습니다 . 표현식 (response is not 'y')
이 참인지 또는 참 인지 묻는 경우 'y'
(항상 비어 있지 않은 문자열은 항상 참임) 등 입니다. or
연산자 양쪽의 다양한 표현식 은 독립적 입니다. 여러 값에 대해 하나의 변수를 테스트하는 방법을 참조하십시오 .
또한is
문자열을 테스트 하는 데 사용 해서는 안됩니다 . CPython 인터프리터 는 특정 상황 에서 문자열 오브젝트를 재사용 할 수 있지만 이는 신뢰 할만한 동작이 아닙니다.
따라서 다음을 사용하십시오.
response not in ('y', 'n', 'yes', 'no')
대신; 이것은 등식 테스트 ( ==
)를 response
사용하여 동일한 내용 (값)을 가진 문자열을 참조 하는지 판별합니다 .
동일하게 적용됩니다 response == 'y' or 'yes'
; 사용하는 response in ('y', 'yes')
대신.