我正在测试一个继承自另一个非常复杂的类的类,它有DB连接方法和一堆依赖关系,我想模拟它的基类,这样我就可以很好地使用子类中定义的方法,但是当我从一个被模拟的类继承时,对象本身变成了一个模拟对象,失去了它所有的方法。
我怎么能嘲笑一个超类
情况大致可以归纳如下:
import mock
ClassMock = mock.MagicMock()
class RealClass(ClassMock):
def lol(self):
print 'lol'
real = RealClass()
real.lol() # Does not print lol, but returns another mock
print real # prints <MagicMock id='...'>
这是一个简化的例子,实际上是RealClass
扩展了AnotherClass
,但是我设法截取了AnotherClass
并用mock替换了它。
4条答案
按热度按时间3yhwsihp1#
这个问题我已经纠结了很长时间,但我想我终于找到了解决办法。
正如你已经注意到的,如果你试图用一个Mock来替换基类,你试图测试的类只是变成了一个mock,这就破坏了你测试它的能力。解决方案是只模拟基类的方法,而不是整个基类本身,但是说起来容易做起来难:在逐个测试基础上逐个模拟每一个方法是非常容易出错的。
我所做的是创建一个类来扫描另一个类,并将与另一个类上的方法相匹配的
Mock()
赋值给自己,然后在测试中使用这个类来代替真实的的基类。下面是一个伪类:
例如,您可能有一些代码,如下所示(抱歉,这有点做作,只是假设
BaseClass
和SecondClass
正在执行重要的工作,包含许多方法,甚至根本不需要您定义):然后,您就可以编写一些如下所示的测试:
因此,存在于基类中的方法仍然可以作为您可以与之交互的mock来使用,但是您的类本身不会成为mock。
我已经很小心地确保这在python2和python3中都有效。
6mzjoqzu2#
这应该对你有用。
您不应该像以前那样传递类的示例。
mock.MagicMock
是一个类,所以您直接传递它。0x6upsns3#
我也遇到过类似的问题,可以通过
@patch.object
来实现,参见python官方文档中的补丁装饰器示例。von4xj4u4#
下面举例说明@Akash的答案,它实际上解决了我的继承模拟挑战: