[python] 파이썬은 여러 반환 값을 모의

파이썬 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')대신.


답변