我有以下结构:
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)