我正在为请求库编写单元测试。对于我的大多数库,我对响应运行一个.content.decode('utf-8')来获取实际文本。但是,当我从api调用中模拟这个响应时,如何模拟请求调用接收到的响应对象?是否有一个requests.content.encode('utf-8',data))看起来类似的进程,它实际上可以模拟来自API调用的响应(以编码格式),然后我对该对象进行解码。
样本代码:
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_bare.content.decode('utf-8')
print resp_text
except:
raise 因此,例如,如果我想对get_something函数进行单元测试,我需要模拟sample_fct函数。为此,我必须将sample_fct.return_value设置为它正在返回的请求对象。
那么我如何创建这个对象。
发布于 2018-11-16 11:44:21
就像我上面说的,你可以这样嘲笑我的反应。请注意,我采取了一些自由,使您的代码和我的测试实际工作。它们包括在评论中:
"""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'https://stackoverflow.com/questions/53309207
复制相似问题