如何修补 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'}))

一些注意事项:

  1. 我用白框风格写了它并检查了你视图的所有调用:你可以做得更松散并省略一些检查;如果您只想检查调用,请使用 self.assertTrue(mock_con.send_message.called);如果您对某些参数内容不感兴趣,请使用 mock.ANY 作为参数。
  2. autospec=True 不是强制性的但非常有用:看看 autospeccing.
  3. 如果代码包含一些错误,我深表歉意......我现在无法测试它,但我希望这个想法足够清楚。