如何解决Python unittest:模拟从类对象调用的外部库函数
您好,我有以下代码;
我正在尝试测试 file_a 中的加载功能;下载是我导入的外部模块中的函数
file_a.py
from foo import download
class Bar()
__init__(self,arg_1):
self.var = arg_1
def load(self):
if self.var == "latest_lib":
download("latest_lib")
我写了这样的测试
test.py
@patch(file_a.download)
def test_download():
import file_a
bar = file_a.Bar("latest_lib")
bar.load()
file_a.download.assert_called()
但似乎 bar 对象没有调用模拟下载,而是调用导入的下载。如何解决此问题并使我的测试通过?
解决方法
我试着用你自己的代码看看哪里出错了。有一些语法错误并不重要,但主要问题是您应该将字符串传递给 patch
以使其工作。
这是我对您的代码所做的修改,使这一切发生:
# file_a.py
from pprint import pprint as pp
class Bar():
def __init__(self,arg_1):
self.var = arg_1
def load(self):
if self.var == "latest_lib":
pp("latest_lib")
还有:
# test_file_a.py
import unittest
from unittest.mock import patch
class TestStringMethods(unittest.TestCase):
@patch("file_a.pp")
def test_download(self,pp):
import file_a
bar = file_a.Bar("latest_lib")
bar.load()
pp.assert_called()
if __name__ == "__main__":
unittest.main()
注意:
- 您需要将字符串传递给
patch
以使其在运行时模拟对象。 - 您必须在测试函数中接收模拟对象。
- 我在这里使用了基于类的测试,因为我想使用
unittest
标准库,但如果您使用pytest
,则不必这样做。
还有来自 official doc 的最后一个音符:
基本原理是在查找对象的地方打补丁, 这不一定与定义的地方相同。
,我认为您缺少模拟设置:
@patch("foo.download")
def test_download(mock_download):
from file_a import Bar
Bar("latest_lib").load()
mock_download.assert_called()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。