首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何测试一个对象的方法是否被调用?

如何测试一个对象的方法是否被调用?
EN

Stack Overflow用户
提问于 2022-08-15 19:11:01
回答 1查看 43关注 0票数 0

嗨,我正在试着测试,看看对象A中的方法是否调用了另一个对象,对象B,方法。我已经有了单独的测试来测试B的功能,所以我的目标只是看看是否调用了B的方法。我试图使用模拟创建一个模拟对象B,遵循类似于的方法,但始终得到以下错误:AssertionError: Expected 'process' to have been called once. Called 0 times. --我是不是做错了模拟?

据我所知,这个回答建议访问sut中的字段并将其设置为模拟,但由于我的代码是如何设置的,所以我无法访问其他对象。

示例代码:

代码语言:javascript
运行
复制
# object B
from abc import ABCMeta


class B(metaclass=ABCMeta):
    def process(self):
        print('I am B')
代码语言:javascript
运行
复制
# object C
from abc import ABCMeta


class C(metaclass=ABCMeta):
    def process(self):
        print('I am C')
代码语言:javascript
运行
复制
# 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()

示例测试:

代码语言:javascript
运行
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2022-08-15 20:57:55

这些帖子帮助了我,link1 link2。像这样的东西应该管用。我认为这样做是为了在B中为进程创建一个模拟包装器,因此,它将计算被调用的时间。

如果您有更多的洞察力或更好的解释,这将是值得感谢的。

代码语言:javascript
运行
复制
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个参数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73365469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档