2015-02-03 2 views
0

파이썬 모의 라이브러리를 사용하여 파일을 모의하려고합니다. 비록 간단하지만, 나는 여전히 크기 인수를 받아야 할 때 읽기 함수를 조롱하는 방법을 이해하지 못한다. side_effect를 사용하여 대체 함수를 만들려고했는데, 이는 값으로 전달 된 데이터 만 읽습니다.크기 변수를 사용하는 모의 파일 읽기 방법

def mock_read(value): 
    test_string = "abcdefghijklmnopqrs" 

    ''' 
    Now it should read enough values from the test string, but 
    I haven't figured out a way to store the position where the 
    "read" method has stopped. 
    ''' 

mock_file = MagicMock(spec=file) 
mock_file.read.side_effect = mock_read 

는 그러나, 나는의 side_effect 기능에 독자의 현재 위치를 저장하기 위해 단지 그 후에 읽는 방법을 알아 냈하지 않은 :

는 생각이다. 어쩌면 더 나은 접근법이 있다고 생각하지만, 아직 그것을 알아 냈습니다.

+0

죄송합니다. 귀하의 질문을 잘 읽지 못했습니다 .... 내 대답이 바뀌었지만 지금 귀하의 질문에 대한 답변이 –

+0

이 주제에 관심이 있습니까? –

+0

예, 답장을 보내 주시면 문제가 해결되었습니다. BytesIO 객체를 생성 할 때 무언가를하려고하고 mock 객체의 read 메소드가 BytesIO 객체의 read 메소드를 가리 키도록 시도했지만, 그 답이 더 나은 접근법을 제공합니다. – lucasmoura

답변

2

불행히도 mock_open은 부분 읽기를 지원하지 않으며, 또한 당신은 MagicMock(spec=file)을 작성했기 때문에 파이썬 2.7을 사용하고 mock_open은 매우 제한적입니다.

과 같은 일반적인 질문은을 보유 할 수있는 side_effect을 쓸 수 있습니다.

from mock import MagicMock 

class my_read_side_effect(): 
    def __init__(self,data=""): 
     self._data = data 
    def __call__(self, l=0): #That make my_read_side_effect a callable 
     if not self._data: 
      return "" 
     if not l: 
      l = len(self._data) 
     r, self._data = self._data[:l], self._data[l:] 
     return r 

mock_file = MagicMock(spec=file) 
mock_file.read.side_effect = my_read_side_effect("abcdefghijklmnopqrs") 
assert "abcdef" == mock_file.read(6) 
assert "ghijklm" == mock_file.read(7) 
assert "nopqrs" == mock_file.read() 

을 또한 우리가 있음을 주입 할 수 있습니다 간단한은 (mock 부작용의 목록과 같은 발전기를 해석하기 때문에 발전기 여기에 사용할 수 없습니다) __call__ 구현 클래스를 사용하는 것입니다 이럴 몇 가지 방법이 있지만, 파이썬에서 그것을 할 수있다 구현에 mock_open 패치 mock_open.read() 방법으로 처리기.

from mock patch, mock_open 

with patch("__builtin__.open", new_callable=mock_open) as mo: 
    mock_file = mo.return_value 
    mock_file.read.side_effect = my_read_side_effect("abcdefghijklmnopqrs") 
    assert "abcdef" == mock_file.read(6) 
    assert "ghijklm" == mock_file.read(7) 
    assert "nopqrs" == mock_file.read() 

파일이 함수에서 열려 있고 인수로 전달되지 않은 테스트에서이를 사용하는 간단한 방법을 제공합니다.

관련 문제