单元测试和模拟,如何重置它们?

2024-05-14 14:11:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在测试一个需要在构造函数中进行模拟的类,所以我通常会这样做:

class TestActionManager(unittest.TestCase):
    @patch('actionlib.SimpleActionClient', return_value=create_autospec(actionlib.SimpleActionClient))
    def setUp(self, mock1):
        self.action_manager = ActionManager()

然后在这个类中,我添加了所有的测试。所以第一个很好用

    def test_1(self):
        self.action_manager.f()
        self.action_manager.f.assert_called_once()

但如果我添加另一个测试并同时运行

    def test_2(self):
        self.action_manager.f()
        self.action_manager.f.assert_called_once()

它说f已经被调用了两次。我本来希望安装程序在开始每个测试之前创建一个新的ActionManager(并因此创建一个新的模拟),但这显然没有发生,因为模拟是以某种方式共享的。我也试着去做

def tearDown(self):
    del self.action_manager

但这并不能解决问题

我读过一些与此有关的文章 Python Testing - Reset all mocks? 解决方案是使用不同的库(我希望避免)

Any way to reset a mocked method to its original state? - Python Mock - mock 1.0b1中,它使用不同的类来实现

是否有可能在每次测试之前或之后重置同一类中的模拟


Tags: totestselfdefmanageractionassertunittest
1条回答
网友
1楼 · 发布于 2024-05-14 14:11:42

顺便说一句,这是一个unittest问题,而不是一个pytest问题

不管怎样

我相信你要找的是^{}

一般来说,它的工作原理如下:

def test_1(self):
    f = MagicMock()  # or whatever you're mocking
    f()
    f.assert_called_once()
    f.reset_mock()
    f()
    f.assert_called_once()

结果将是PASSED

如果您想要自动化,那么您可以将模拟对象存储在setUp中,并在tearDown中调用模拟对象的.reset_mock()方法

def setUp(self, mock1):
    self.mock1 = mock1
    # ... do other things ...

def tearDown(self):
    self.mock1.reset_mock()

相关问题 更多 >

    热门问题