如何修补 Flask 视图调用的函数
How to patch a function that a Flask view calls
我的 webapp 想要使用 boto 向 AWS SQS 发送消息,我想模拟发送实际消息并只检查调用 send_message 是否被调用。但是我不明白如何使用 python mock 来修补被测试函数调用的函数。
我怎样才能像下面的伪类代码那样实现对 boto con.send_message 的模拟?
views.py:
@app.route('/test')
def send_msg():
con = boto.sqs.connect_to_region("eu-west-1",aws_access_key_id="asd",aws_secret_access_key="asd")
que = con.get_queue('my_queue')
msg = json.dumps({'data':'asd'})
r=con.send_message(que, msg)
tests.py
class MyTestCase(unittest.TestCase):
def test_test(self):
with patch('views.con.send_message') as sqs_send:
self.test_client.get('/test')
assert(sqs_send.called)
要进行此类测试,您需要 patch
connect_to_region()
。修补此方法后 return 一个 MagicMock()
对象,您可以使用它来测试所有函数行为。
您的测试用例可以是这样的:
class MyTestCase(unittest.TestCase):
@patch("boto.sqs.connect_to_region", autospec=True)
def test_test(self, mock_connect_to_region):
#grab the mocked connection returned by patched connect_to_region
mock_con = mock_connect_to_region.return_value
#call client
self.test_client.get('/test')
#test connect_to_region call
mock_connect_to_region.assert_called_with("eu-west-1",aws_access_key_id="asd",aws_secret_access_key="asd")
#test get_queue()
mock_con.get_queue.assert_called_with('my_queue')
#finaly test send_message
mock_con.send_message.assert_called_with(mock_con.get_queue.return_value, json.dumps({'data':'asd'}))
一些注意事项:
- 我用白框风格写了它并检查了你视图的所有调用:你可以做得更松散并省略一些检查;如果您只想检查调用,请使用
self.assertTrue(mock_con.send_message.called)
;如果您对某些参数内容不感兴趣,请使用 mock.ANY
作为参数。
autospec=True
不是强制性的但非常有用:看看 autospeccing.
- 如果代码包含一些错误,我深表歉意......我现在无法测试它,但我希望这个想法足够清楚。
我的 webapp 想要使用 boto 向 AWS SQS 发送消息,我想模拟发送实际消息并只检查调用 send_message 是否被调用。但是我不明白如何使用 python mock 来修补被测试函数调用的函数。
我怎样才能像下面的伪类代码那样实现对 boto con.send_message 的模拟?
views.py:
@app.route('/test')
def send_msg():
con = boto.sqs.connect_to_region("eu-west-1",aws_access_key_id="asd",aws_secret_access_key="asd")
que = con.get_queue('my_queue')
msg = json.dumps({'data':'asd'})
r=con.send_message(que, msg)
tests.py
class MyTestCase(unittest.TestCase):
def test_test(self):
with patch('views.con.send_message') as sqs_send:
self.test_client.get('/test')
assert(sqs_send.called)
要进行此类测试,您需要 patch
connect_to_region()
。修补此方法后 return 一个 MagicMock()
对象,您可以使用它来测试所有函数行为。
您的测试用例可以是这样的:
class MyTestCase(unittest.TestCase):
@patch("boto.sqs.connect_to_region", autospec=True)
def test_test(self, mock_connect_to_region):
#grab the mocked connection returned by patched connect_to_region
mock_con = mock_connect_to_region.return_value
#call client
self.test_client.get('/test')
#test connect_to_region call
mock_connect_to_region.assert_called_with("eu-west-1",aws_access_key_id="asd",aws_secret_access_key="asd")
#test get_queue()
mock_con.get_queue.assert_called_with('my_queue')
#finaly test send_message
mock_con.send_message.assert_called_with(mock_con.get_queue.return_value, json.dumps({'data':'asd'}))
一些注意事项:
- 我用白框风格写了它并检查了你视图的所有调用:你可以做得更松散并省略一些检查;如果您只想检查调用,请使用
self.assertTrue(mock_con.send_message.called)
;如果您对某些参数内容不感兴趣,请使用mock.ANY
作为参数。 autospec=True
不是强制性的但非常有用:看看 autospeccing.- 如果代码包含一些错误,我深表歉意......我现在无法测试它,但我希望这个想法足够清楚。