似乎无法修补另一个文件中的类和方法



我一直在用这样的小模型撞墙:

这是树:

src
├── __init__.py
├── file_a.py
├── file_b.py

test
├── test_a.py

在file_a:

class qaz(object):
def __init__(self):
print("nnin qaz")
def exec_bar(self):
bar_inst = bar()
bar_inst.execute("a", "b")

在file_b:

class bar(object):
def __init__(self, a, b):
print("nnin bar")
def execute(self, c, d):
print("nnin 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'

这意味着模拟不起作用。我似乎无法弄清楚我做错了什么。

在file_b中,您希望在">init">
中传递 2 个参数def __init__(self, a, b):

但是file_a当您为类栏创建对象时,您不会传递任何参数
bar_inst = bar()

这就是为什么您看到错误
TypeError: __init__() missing 2 required positional arguments: 'a' and 'b'

你做两件事:

  1. def __init__(self, a, b):中删除参数 a 和 b
  2. 在以下情况下传递参数

新解决方案:

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()

Sai Ram解决了这个问题,但想发布代码以供将来参考。测试最终看起来像这样;

来自 unittest.mock 导入补丁,MagicMock 从src.file_a进口加兹 从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()

相关内容

  • 没有找到相关文章

最新更新