2014-10-04 2 views
2

Мне нужно написать тест, есть StringIO и curl, поэтому я попытался их высмеять, но он возвращает плохие данные, не такие, как я жду.Python mock не работает

функция тестирования Python:

def test_make_curl_request(self): 
     redirect_url = 'abc' 
     content = 'Content' 
     mock_curl = mock.MagicMock() 
     mock_curl.getinfo = mock.Mock(return_value=redirect_url) 
     mock_curl.setopt = mock.Mock() 
     mock_curl.perform = mock.Mock() 

     mock_io_string = mock.MagicMock() 
     mock_io_string.getvalue = mock.Mock(return_value=content) 

     with mock.patch('pycurl.Curl', mock.Mock(return_value=mock_curl)): 
      with mock.patch('source.lib.StringIO', mock.Mock(return_value=mock_io_string)): 
       with mock.patch('source.lib.to_str', mock.Mock(return_value=redirect_url)): 
        with mock.patch('source.lib.to_unicode', mock.Mock(return_value=redirect_url)): 
         with mock.patch('source.lib.prepare_url', mock.Mock()): 
          self.assertEqual(init.make_pycurl_request('http://test.rg', 10), (content, redirect_url)) 

Тестирование функции:

def make_pycurl_request(url, timeout, useragent=None): 
    prepared_url = to_str(prepare_url(url), 'ignore') 
    buff = StringIO() 
    curl = pycurl.Curl() 
    curl.setopt(curl.URL, prepared_url) 
    if useragent: 
     curl.setopt(curl.USERAGENT, useragent) 
    curl.setopt(curl.WRITEDATA, buff) 
    curl.setopt(curl.FOLLOWLOCATION, False) 
    # curl.setopt(curl.CONNECTTIMEOUT, timeout) 
    curl.setopt(curl.TIMEOUT, timeout) 
    curl.perform() 
    content = buff.getvalue() 
    redirect_url = curl.getinfo(curl.REDIRECT_URL) 
    curl.close() 
    if redirect_url is not None: 
     redirect_url = to_unicode(redirect_url, 'ignore') 
    return content, redirect_url 

Так что мой макет на content не работает, я не знаю, что делать.

ответ

2

Я думаю, что вы создаете больше макетных объектов, чем вам нужно, и вы не устанавливаете возвращаемые значения совершенно правильно. Например, я бы заменил mock_io_string.getvalue = mock.Mock(return_value=content) на mock_io_string.getvalue.return_value = content.

Смежные вопросы