cam*_*ack 2 python unit-testing mocking python-requests
使用Python 3.5,requests == 2.18.4,Flask == 0.12.2,urllib3 == 1.22
some_method我的主server.py文件中有一个方法,该方法应该POST使用一些数据来生成一些URL:
def some_method(url, data):
...
error = None
try:
response = requests.post(url, json=data)
except requests.exceptions.ConnectionError as e:
...
app.logger.error(...)
response = None
error = str(e)
return error, response
Run Code Online (Sandbox Code Playgroud)
服务器文件定义:app = Flask(__name__),并some_method从调用@app.route(... methods=['PATCH'])。
如果此方法引发错误,则路由最终将返回500。
从一个测试文件运行测试,import server并app = server.app使用unittest和导入应用程序mock.patch。
我能够测试整个应用程序的行为,并进行测试,该测试显示该方法返回错误并看到路由在正确的位置终止时,应用程序路由的行为符合预期:
class ServerTestCase(unittest.TestCase):
...
@patch('server.some_method')
def test_route_response_status_500_when_throws(self, mock_response):
mock_response.return_value = 'some_error_string', None
response = self.app.patch(some_url, some_data, content_type='application/json')
self.assertEqual(response.status_code, 500)
Run Code Online (Sandbox Code Playgroud)
但是,我真的很想单独测试另一个测试some_method:
requests.post扔requests.exceptions.ConnectionErrorapp.logger并断言它在执行过程中记录了错误)模拟该requests.post函数,然后在模拟上将side_effect属性设置为所需的异常:
@patch('requests.post')
def test_request_post_exception(self, post_mock):
post_mock.side_effect = requests.exceptions.ConnectionError()
# run your test, code calling `requests.post()` will trigger the exception.
Run Code Online (Sandbox Code Playgroud)
从链接的文档中:
它既可以是调用模拟程序时要调用的函数,也可以是可迭代的或要引发的异常(类或实例)。
[...]
引发异常(以测试API的异常处理)的模拟示例:
Run Code Online (Sandbox Code Playgroud)>>> mock = Mock() >>> mock.side_effect = Exception('Boom!') >>> mock() Traceback (most recent call last): ... Exception: Boom!
(加粗强调我的)。
side_effect允许您执行副作用,包括在调用模拟程序时引发异常:Run Code Online (Sandbox Code Playgroud)>>> mock = Mock(side_effect=KeyError('foo')) >>> mock() Traceback (most recent call last): ... KeyError: 'foo'
| 归档时间: |
|
| 查看次数: |
4644 次 |
| 最近记录: |