我一直把头撞在墙上这样的小模型上:
这棵树是:
src
├── __init__.py
├── file_a.py
├── file_b.py
test
├── test_a.py在file_a中:
class qaz(object):
def __init__(self):
print("\n\nin qaz")
def exec_bar(self):
bar_inst = bar()
bar_inst.execute("a", "b")在file_b中:
class bar(object):
def __init__(self, a, b):
print("\n\nin bar")
def execute(self, c, d):
print("\n\nin bar -> execute")因此,我想模拟bar,这样我就可以在没有任何问题的情况下测试a。
在test_a中:
from unittest.mock import patch, MagicMock
from src.file_a import qaz
from src.file_b import bar
class BarTester(unittest.TestCase):
@patch('src.file_b.bar')
def test_bar(self, mock_bar):
bar_inst = MagicMock()
bar_inst.execute.return_value = None
mock_bar.return_value = bar_inst
q = qaz()
q.exec_bar()这种情况每次都会失败:
TypeError: __init__() missing 2 required positional arguments: 'a' and 'b'这意味着模拟不起作用。我似乎找不出我做错了什么。
发布于 2020-05-13 22:12:40
在file_b中,您期望在"init“中传递两个参数。
def __init__(self, a, b):
但是在file_a中,当您为类栏创建对象时,不传递任何参数。
bar_inst = bar()
这就是为什么你看到了错误
TypeError: __init__() missing 2 required positional arguments: 'a' and 'b'
你做了两件事:
当def __init__(self, a, b):
中删除参数a和b时
新解决方案:
from mock import patch
import unittest
from src.file_a import qaz
from src.file_b import bar
class BarTester(unittest.TestCase):
@patch.object(bar, '__init__', return_value=None)
def test_bar(self, *mock_stdout):
q = qaz()
q.exec_bar()发布于 2020-05-14 00:45:21
赛拉姆解决了这个问题,但是想把代码发出来供以后参考。最终测试结果是这样的;
从unittest.mock导入修补程序,MagicMock从src.file_a导入qaz从src.file_b导入栏
class BarTester(unittest.TestCase):
@patch.object(bar, '__init__', return_value=None)
@patch.object(bar, 'execute', return_value=None)
def test_bar(self, *mock_bar):
q = qaz()
q.exec_bar()https://stackoverflow.com/questions/61785358
复制相似问题