擅长:python、mysql、java
<p>我在mock<sup>1</sup>方面不是很有经验,但我是通过使用函数包装器而不是默认的<code>MagicMock</code>来完成的:</p>
<pre><code>class FuncWrapper(object):
def __init__(self, func):
self.call_count = 0
self.func = func
def __call__(self, *args, **kwargs):
self.call_count += 1
return self.func(*args, **kwargs)
class CounterTest(unittest.TestCase):
def test_call_count(self):
c = Counter()
new_call = FuncWrapper(c.increment)
with mock.patch.object(c, 'increment', new=new_call) as fake_increment:
print fake_increment
self.assertEquals(0, fake_increment.call_count)
c.increment()
self.assertEquals(1, fake_increment.call_count)
self.assertEquals(1, c.count) # Fails.
</code></pre>
<p>当然,这个<code>FuncWrapper</code>非常小。它只计算调用次数,然后将流控制委托回原始函数。如果需要同时测试其他东西,则需要添加到<code>FuncWrapper</code>类中。我还修补了一个类实例,而不是整个类。主要原因是我需要一个<code>FuncWrapper</code>中的实例方法。</p>
<p>事实上,我刚开始学习——认为自己受到了警告;)。</sup></p>