最近在用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是否真的被调用(但是不执行任何动作)