擅长:python、mysql、java
<p>我不知道这是否是最好的解决方案,但我使用<a href="https://docs.python.org/2/library/functions.html#type" rel="noreferrer">type()</a>用不同的父类重新定义了前面的类。我构建了一个名为<code>patch_parent()</code>的函数,该函数返回具有父模拟的类:</p>
<pre><code>from contextlib import contextmanager
@contextmanager
def patch_parent(class_):
"""
Mock the bases
"""
yield type(class_.__name__, (Mock,), dict(class_.__dict__))
</code></pre>
<p>在此之后,您可以像这样使用<code>patch_parent</code>:</p>
<pre><code>class Bar():
def method(self, param1, param2...):
...
class Foo(Bar):
pass
>>> with patch_parent(Foo) as MockFoo:
... f = MockFoo()
... print f
... print f.method()
...
<Foo id='15488016'>
<Foo name='mock.method()' id='15541520'>
>>> s = Foo()
>>> s.method()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 3 arguments (1 given)
</code></pre>
<p><code>MockFoo</code>类仍然有<code>Foo</code>类的方法,并且它没有在父类中定义方法,因为父类现在是<code>Mock</code>类。</p>