Python-mock:如何测试是否调用了super()



我有以下结构:

class A(Object):
    def method(self):
        return 'a'
class B(A):
   def __init__(self, test):
       self.test = test
   def method(self):
        if self.test:
           return super(A, self).method(self)
        else:
           return 'b'

我想做的是写一个测试用例来测试if self。test为true则调用超函数并调用类A的方法函数

我如何才能做到这一点?我应该嘲笑什么?

Advanced Q:如果A类和B类在一个单独的模块中,并且它们具有相同的名称,该怎么办?所以我写的不是B类:A类(模块1.A)这改变了嘲笑吗?

正如@MartijnPieters指出的那样,测试super是否被调用通常是对实现细节的测试,而不是对合约的测试。尽管如此,测试特定的实现可能仍然是可取的——或者父类可能有一个需要调用super的契约。要测试是否调用了super,可以使用@mgilson提到的mock。详细答案:

import mock, unittest
class TestB(unittest.TestCase):
    @mock.patch("A.method")
    def test_super_method(self, mock_super):
        B(True).method()
        self.assertTrue(mock_super.called)
    @mock.patch("A.method")
    def test_super_method(self, mock_super):
        B(False).method()
        self.assertFalse(mock_super.called)

您需要在补丁中指定完整的命名空间。例如,@mock.patch("module.submodule.A.method")。A中的任何方法都可以这样做,包括__init__;语法完全相同

为了构建@Malina的优秀答案,如果你不能在模块A上修补方法(例如,A在第三方库中,是一个糟糕的遗留系统的一部分,在运行时动态创建,等等),你仍然可以通过在类B上显式地创建另一个方法来测试此功能。

修正类B

import A
class B(A):
   def __init__(self, test):
       self.test = test
   def method(self):
        if self.test:
           self._delegate_to_A()  # Move the super call to a separate method
        else:
           return 'b'
   
   def _delegate_to_A(self)
       return super(A, self).method(self)

B类修订试验规程

import mock, unittest
class TestB(unittest.TestCase):
    # Patch B's `delegate` method instead of A
    @mock.patch("B._delegate_to_A")
    def test_super_method(self, mock_super):
        B(True).method()
        self.assertTrue(mock_super.called)
    @mock.patch("B._delegate_to_A")
    def test_super_method(self, mock_super):
        B(False).method()
        self.assertFalse(mock_super.called)

相关内容

最新更新