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

2022-01-08 00:00:00 python mocking flask unit-testing magicmock

问题描述

我正在尝试为我的烧瓶应用程序修补公共方法,但它似乎不起作用.

I'm trying to patch a public method for my flask application but it doesn't seem to work.

这是我在 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

这是我没有解析的测试.

And this is my test which it's not parsing.

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.

I believe your problem is that you're not patching in the right namespace. See where_to_patch documentation for unittest.mock.patch.

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

Essentially, you're patching the definition of get_feed() in mrss.feed_burner but your view handler feed() already has a reference to the original mrss.feed_burner.get_feed(). To solve this problem, you need to patch the reference in your view file.

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

Based on your usage of get_feed in your view function, I assume you're importing get_feed like so

view_file.py

view_file.py

from mrss.feed_burner import get_feed

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

If so, you should be patching view_file.get_feed like so:

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

相关文章