xiaobaicai123 发表于 2016-3-18 17:03:13

python Mock 使用

Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为。类似于Hot Patclass Mock(spec=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








wowopo 发表于 2016-8-10 11:22:23

谢谢分享   学习python中       :victory:
页: [1]
查看完整版本: python Mock 使用