嗨,我正在试着测试,看看对象A中的方法是否调用了另一个对象,对象B,方法。我已经有了单独的测试来测试B的功能,所以我的目标只是看看是否调用了B的方法。我试图使用模拟创建一个模拟对象B,遵循类似于这的方法,但始终得到以下错误:AssertionError: Expected 'process' to have been called once. Called 0 times.
--我是不是做错了模拟?
据我所知,这个回答建议访问sut中的字段并将其设置为模拟,但由于我的代码是如何设置的,所以我无法访问其他对象。
示例代码:
# object B
from abc import ABCMeta
class B(metaclass=ABCMeta):
def process(self):
print('I am B')
# object C
from abc import ABCMeta
class C(metaclass=ABCMeta):
def process(self):
print('I am C')
# object A
from abc import ABCMeta
from b import B
from c import C
class A(metaclass=ABCMeta):
def __init__(self):
self.__known_auto_processes = {}
self.__inti_know_processes()
def process(self, arg):
try:
self.__known_auto_processes[arg].process()
except KeyError as error:
print(f'Invalid arg option {error.args}.')
def __inti_know_processes(self):
self.__known_auto_processes['B'] = B()
self.__known_auto_processes['C'] = C()
示例测试:
import unittest
from unittest.mock import patch
from a import A
class TestA(unittest.TestCase):
@patch("b.B")
def test_b_call(self, mock_b):
a = A()
a.process('B')
mock_b.process.assert_called_once()
发布于 2022-08-15 20:57:55
这些帖子帮助了我,link1 link2。像这样的东西应该管用。我认为这样做是为了在B中为进程创建一个模拟包装器,因此,它将计算被调用的时间。
如果您有更多的洞察力或更好的解释,这将是值得感谢的。
import unittest
from unittest.mock import patch, PropertyMock
from a import A
from b import B
class TestA(unittest.TestCase):
@patch.object(B, 'process', new_callable=PropertyMock)
def test_b_call(self, mock_b):
a = A()
mock_b.return_value = mock_b.process
a.process('B')
mock_b.process.assert_called_once()
如果代码希望返回某些内容,也可以添加类似mock_obj.process.return_value = (mock.MagicMock(), mock.MagicMock())
的内容,在我的实际代码中,它需要2个参数。
https://stackoverflow.com/questions/73365469
复制相似问题