在pythonunittest中,如果没有使用mock,检查函数是否被调用的规范方法是什么?

2024-10-04 07:38:54 发布

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

如果我有一个类似于下面的1的类,并且我想测试bar函数的各种情况,那么如何在不模仿私有函数的情况下完成这一任务呢?换句话说,如何在Python的unittest库中实现类似的功能:

def test_bar():
    f = Foo()
    f.bar(3)
    expect(self._is_positive_number).toBeCalled()

食品

^{pr2}$

Tags: 函数testself功能食品numberfoois
2条回答

据我所知,不模仿私有方法是不可能做到这一点的。但是,mock库(从3.3起在标准库中作为unittest.mock提供,否则是一个单独的安装)使这一点相对轻松:

try:
    # Python 3.3 or later
    import unittest.mock as mock
except ImportError:
    # Make sure you install it first
    import mock

class TestFoo(unittest.TestCase):
    def setUp(self):
        self.f = Foo()

    def test_bar(self):
        with mock.patch.object(self.f, '_is_positive_number') as is_pos:
            self.f.bar(3)
            self.assertTrue(is_pos.called)

使用^{}库是首选方法。在

下面是三个私有方法的完整示例。如果你愿意的话,你可以选择较短的名字,但我最好直截了当。请注意,为了安全起见,您应该声明不仅调用了所需的方法,而且还未调用其他私有方法:

from unittest import TestCase
from mock import Mock


class MyTestCase(TestCase):
    def setUp(self):
        self.instance = Foo()
        self.instance._is_positive_number = Mock()
        self.instance._is_negative_number = Mock()
        self.instance._is_zero = Mock()

    def test_positive(self):
        self.instance.bar(3)
        self.assertTrue(self.instance._is_positive_number.called)
        self.assertFalse(self.instance._is_negative_number.called)
        self.assertFalse(self.instance._is_zero.called)

    def test_negative(self):
        self.instance.bar(-3)
        self.assertFalse(self.instance._is_positive_number.called)
        self.assertTrue(self.instance._is_negative_number.called)
        self.assertFalse(self.instance._is_zero.called)

    def test_zero(self):
        self.instance.bar(0)
        self.assertFalse(self.instance._is_positive_number.called)
        self.assertFalse(self.instance._is_negative_number.called)
        self.assertTrue(self.instance._is_zero.called)

相关问题 更多 >