对于公共(public)方法,Python 模拟补丁无法按预期工作

标签 python unit-testing flask mocking magicmock

我正在尝试为我的 Flask 应用程序修补一个公共(public)方法,但它似乎不起作用。

这是我在 mrss.feed_burner 中的代码

def get_feed(env=os.environ):
   return 'something'

这就是我使用它的方式

@app.route("/feed")
    def feed():
        mrss_feed = get_feed(env=os.environ)
        response = make_response(mrss_feed)
        response.headers["Content-Type"] = "application/xml"

        return response

这是我的测试,它没有解析。

def test_feed(self):
    with patch('mrss.feed_burner.get_feed', new=lambda: '<xml></xml>'):
        response = self.app.get('/feed')
        self.assertEquals('<xml></xml>', response.data)

最佳答案

我认为您的问题是您没有在正确的命名空间中打补丁。参见 where_to_patch unittest.mock.patch 的文档。

本质上,您正在修补 mrss.feed_burnerget_feed() 的定义,但是您的 View 处理程序 feed() 已经有一个引用原始 mrss.feed_burner.get_feed()。要解决此问题,您需要修补 View 文件中的引用。

根据您在 View 函数中对 get_feed 的使用,我假设您正在像这样导入 get_feed

查看文件.py

from mrss.feed_burner import get_feed

如果是这样,您应该像这样修补 view_file.get_feed:

def test_feed(self):
    with patch('view_file.get_feed', new=lambda: '<xml></xml>'):
        ...

关于对于公共(public)方法,Python 模拟补丁无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30987973/

相关文章:

python - 如何将 flask-sqlalchemy 与现有的 sqlalchemy 模型一起使用?

python - 使用 Flask 获取 int 列表并将这些值作为端点返回

javascript - 在 URL 前缀下将 React 应用程序添加到 Flask

使用用户输入的密码进行 Python 单元测试

c# - 如何避免大型多步骤单元测试?

oracle - 如何(单元)测试数据密集型PL/SQL应用程序

python - Python中的正则表达式——关于一个具体案例

python - 通过索引和掩码更新?

Python 日志记录数据报处理程序

python - 使用 python-xlib 禁用操作、移动、调整大小、最小化等