gpt4 book ai didi

flask - 如何模拟用 Python Flask route() 装饰的方法

转载 作者:行者123 更新时间:2023-12-03 16:10:33 24 4
gpt4 key购买 nike

我需要对 Flask route() 修饰的方法进行单元测试是否被调用。

如果可能的话,我想在不修改被测原始代码的情况下执行此操作,因此模拟该方法将完全符合我的要求。

因此,我问这个关于如何模拟装饰请求方法的具体问题(我想强调这一点,以避免人们用不太具体的答案浪费时间)......

应用示例 jflask.py :

from flask import Flask
app = Flask(__name__)
app.config.from_object(__name__)

@app.route('/hello') # This method represents the code under test.
def hello(): # I want to assert that this method gets
return 'Hello, World' # called without modifying this code.

if __name__ == "__main__":
app.run()

在单元测试中,我使用 @patch()模拟该方法,以便我可以断言它被调用,但断言失败。 IE。当我期望它调用模拟方法时,它不会被调用。

样本单元测试 test_hello.py :
import unittest
import jflask
from unittest.mock import patch

class jTest(unittest.TestCase):
def setUp(self):
#jflask.app.testing = True
self.app = jflask.app.test_client()

@patch('jflask.hello') # mock the hello() method
def test_hello(self, mock_method):
rv = self.app.get('/hello')
mock_method.assert_called() # this assertion fails

我究竟做错了什么 ?

背景

关于我正在尝试测试的实际行为的一些背景信息
(因为上面只是一个浓缩的测试用例,本身可能看起来并不完全理智)。

在我单元测试的实际代码中,有一个 before_request()处理程序
为应用程序安装。这在处理每个请求之前由 Flask 调用,并且在
在某些情况下,这个处理程序被设计为返回一个响应值,它
导致 Flask 请求处理停止(在此应用程序的情况下,此功能用于集中验证请求参数),因此通常的路由请求处理程序将(故意)不被调用。

我的单元测试需要断言请求处理已停止
或继续,视情况而定。
因此,我的测试需要模拟真实的请求处理程序并断言是否
它是否被调用。

最佳答案

这有点hacky,但你可以注入(inject)一个记录器。

@app.route(...):
def hello(logger=None):
logger = logger or self.logger
logger.info(...)
return ...

def test_...(self):
logger = MagicMock()
self.app.get(logger)
self.assertTrue(logger.info.called)

关于flask - 如何模拟用 Python Flask route() 装饰的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47621974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com