我的目录结构如下:
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
还有谁知道在这里做什么?我是否需要更改导入?在测试中?在实际代码中?
答案 0 :(得分:0)
来自docs:
target 应该是
'package.module.ClassName'
形式的字符串。目标已导入,指定对象被新对象替换,因此目标必须可从您从其调用patch()
的环境中导入。
由于测试代码通常不位于程序包中,因此此处的相对导入没有意义。
在补丁(测试代码)中更改目标“路径”以使用绝对路径。您的库代码无需更改。假设mymodule
是顶级程序包名称,而myproject
是项目根目录,则如下所示:
@patch('mymodule.model.functions.MyClass.function')