Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为。类似于Hot Pat[size=1em]class Mock(spec[size=1em]=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, **kwargs)class Mock的参数 先来看看Mock这个类的参数,在上面看到的类定义中,我们知道它有好几个参数,这里介绍最主要的几个: name: 这个是用来命名一个mock对象,只是起到标识作用,当你print一个mock对象的时候,可以看到它的name。 return_value: 这个字段可以指定一个值(或者对象),当mock对象被调用时,如果side_effect函数返回的是DEFAULT,则对mock对象的调用会返回return_value指定的值。 side_effect: 这个参数指向一个可调用对象,一般就是函数。当mock对象被调用时,如果该函数返回值不是DEFAULT时,那么以该函数的返回值作为mock对象调用的返回值。
几种常见的场景
1. Mock一个函数 @mock.patch('function_name')
2. Mock Mock一个对象里面的方法 @mock.patch.object(class, 'function_name')
3. 让Mock的函数每次被调用返回不同的值,而1,2中的方法每次调用都会返回同样的值 --side-effect= [] (序列)
4. 让Mock的函数抛出exception --side-effect=side_effect = Exception
5. Mock多个函数,主要是注意顺序 (patch顺序和函数参数顺序相反)
patch.object和patch , with 用法 举例
@patch
def test_success_request(mock_send_request):
mock_send_request.return_value = "200"
assert_equal(client.visit_ustack(), '200')
assert_true(True,mock_send_request.assert_has_calls)
call_args = mock_send_request.call_args
print(call_args)
assert_is_instance(call_args[0][0], str)
@patch.object
@patch.object(client,'send_request')
def test_fail_request2(mock_request):
mock_request.return_value = "404"
assert_equal(client.visit_ustack(), '404')
with patch & with patch.object
def test_success_request1():
status_code = "404"
mock_request = mock.Mock(return_value=status_code)
with patch('client.send_request', mock_request):
assert_equal(client.visit_ustack(), status_code)
def test_success_request2():
status_code = '200'
mock_request = mock.Mock(return_value=status_code)
with patch.object(client, 'send_request', mock_request):
assert_equal(client.visit_ustack(), status_code)
参考文档:
http://www.blogjava.net/qileilove/archive/2014/05/27/414143.html
https://segmentfault.com/a/1190000002965620
|