Вот как вы можете высмеивать ответ, как я говорил выше. Обратите внимание, что я взял на себя смелость, чтобы ваш код и мой тест действительно заработали. Они включены в комментарии:
"""request_module.py"""
import requests
class SomeClass(object):
"""I put these in a class, since you had self as your first arg"""
def sample_fct(self, endpoint):
try:
request = requests.post (endpoint, verify=False)
except requests.exceptions.RequestException as e:
raise
return request
def get_something(self, test):
try:
response = self.sample_fct(test)
resp_text = response.content.decode('utf-8')
# Changed to return the value instead of print it
return resp_text
except:
raise
Вы можете увидеть в тесте, как я присваиваю возвращаемое значение вашего смоделированного sample_fct
произвольному Mock
объекту. Этому объекту могут быть назначены произвольные атрибуты, что может помочь в проверке возвращаемых значений, которые могут иметь много уровней глубины атрибута.
"""test_request_module.py"""
import unittest
import unittest.mock as mock
from request_module import SomeClass
class TestRequests(unittest.TestCase):
@mock.patch('request_module.SomeClass.sample_fct')
def test_get_something(self, mock_sample_fct):
mock_sample_fct.return_value = mock.Mock(content=b'some content you want to decode \xE2\x98\xBA')
# Testing that your decoded value is returned
some_class = SomeClass()
result = some_class.get_something('some_test_value')
# Note the decoded smiley face
self.assertEqual('some content you want to decode ☺', result)
Обратите внимание, что вы также можете назначать атрибуты атрибутов для Mock
. Поэтому, если ваш абонент ожидает что-то вроде request.attributes.nested_attributes.value
, вы можете сделать что-то подобное, и Mock
разрешит это:
mock_ret = mock.Mock()
mock_ret.request.attributes.nested_attributes.value = 'deep attr value'