Mock小记(一)

最近在用Python写一个Client, 不过单元测试却是个问题, 我不能把自己的用户名密码放到单元测试里,而且这么做每次测试的时间太慢(受网络IO限制)
于是找到了这个, mock,
在Python 3.3里这个是作为标准库存在于unittest.mock这个包里, 不过我用的是2.7.x就用pip安装了一个

用mock来修饰函数:

>>> from mocks import MagicMock
>>> real = SomeClass()

>>> real.method = MagicMock(name=’method’)

>>> real.method(3, 4, 5, key=’value’)

通过一个MagicMock对象我们重写(修饰)了method方法.直接调用real.method()不会有任何动作触发, 也不会返回任何东西

使用mock来检查对象方法是否被调用过:

>>> **from mock import MagicMock >>> class ProductionClass(object): **def method(self):
self.something(1, 2, 3)
… **def something(self, a, b, c): … ** pass

>>> real = ProductionClass()
>>> real.something = MagicMock()
>>> real.method()
>>> real.something.assert_called_once_with(1, 2, 3) #检查是否只被调用过一次
>>> real.something.assert_called_with(1, 2, 3) #检查是否被调用过

mock另外一个常用用法是把mock对象作为参数传入函数:

>>> **class **ProductionClass(object):
… **def closer(self, something): something.close() >>> real = ProductionClass() >>> mock = Mock() >>> real.closer(mock) >>> **mock.close.assert_called_with()

在这里我们把mock作为参数传入用来检测something.close是否真的被调用(但是不执行任何动作)