如何在本地导入的库中使用模拟@patch装饰器?

时间:2019-10-08 19:57:34

标签: python-3.x unit-testing mockito python-mock

我的目录结构如下:

myproject/
├── mymodule/
│   ├── foo.py
│   └── model/
│        └── functions.py
│
└── tests/
    └── footest.py

我的foo.py文件具有如下所示的本地导入:

from .model.functions import MyClass

我试图在一个测试中模拟MyClass方法之一,但是我不知道如何使用@patch装饰器来完成它。通常我这样做:

class CheckLambdaHandler(unittest.TestCase):
    @patch('requests.post')
    def test_post_error(self, mocked_post):
        # Test which uses requests.post

但是当我尝试对本地导入执行类似操作时,它就会中断:

class CheckLambdaHandler(unittest.TestCase):
    @patch('.model.functions.MyClass.function')
    def test_post_error(self, mocked_post):
        # Test which uses requests.post

因为我猜@patch在“。”上进行了字符串拆分。这意味着您不能使用本地进口商品?

ValueError: Empty module name

还有谁知道在这里做什么?我是否需要更改导入?在测试中?在实际代码中?

1 个答案:

答案 0 :(得分:0)

来自docs

  

target 应该是'package.module.ClassName'形式的字符串。目标已导入,指定对象被新对象替换,因此目标必须可从您从其调用patch()的环境中导入。

由于测试代码通常不位于程序包中,因此此处的相对导入没有意义。

在补丁(测试代码)中更改目标“路径”以使用绝对路径。您的库代码无需更改。假设mymodule是顶级程序包名称,而myproject是项目根目录,则如下所示:

@patch('mymodule.model.functions.MyClass.function')