• python中mock的使用


    接下来我们看下mock方法中的几个参数

    一、name参数

    name是标志了唯一的一个mock名,具有唯一的一个mockid:

    import mock
    test_mock = mock.Mock(name='test')
    print(test_mock)
    
    -----结果-----
    <Mock name='test' id='4341327856'>
    

      

    二、return_value参数

    return_value指定的是某个返回的值,可以是一个变量,也可以是一个对象

    2.1mock一个变量值

    import mock
    mock_test1 = mock.Mock(return_value='test') print(mock_test1()) -----结果----- test

      

    2.2mock一个类的对象

    import mock
    #首先创建一个类
    class Person:
        _age = 18
    
        def get_age(self):
            print(self._age)
    
        def get_name(self, name):
            print(name)
    
    
    p = Person()      
    mock_person = mock.Mock(return_value=p)   #把对象p的地址赋值给return_value
    mock_p = mock_person()                    #调用mock对象,mock_p对象的地址和p对象地址一样
    print(mock_p.get_age())                   #查看mock对象的_age值
    print(mock_p.get_name('nee'))             #调用mock对象的方法,查看name值
    
    -----结果-----
    

     

    2.3 mock一个类中的方法

    class Person:
        _age = 18
    
        def get_age(self):
            return self._age
    
    p = Person()
    print(p.get_age())                         #不使用mock
    p.get_age = mock.Mock(return_value=17)     #使用mock
    print(p.get_age())
    
    -----结果-----
    18
    17

    如果这个方法中需要参数呢?如下:

    class Person:
        _age = 18
    
        def get_age(self):
            return self._age
    
        def get_name(self, name):
            return name
    
    p = Person()
    p.get_name = mock.Mock(return_value='nee')
    print(p.get_name())                         #无参数
    print(p.get_name('cai'))                    #有参数
    
    -----结果-----
    nee
    nee
    

      由此可见,不需要任何参数,都能mock出相应的内容

    三、side_effect参数

    3.1抛出异常

    import mock
    test_mock = mock.Mock(return_value='test', side_effect=KeyError)
    print(test_mock())
    
    -----结果-----
    .
    .
        raise effect
    KeyError
    

      

    3.2指定的参数的值是一个list或者tuple,可以依次返回指定值,有点类似于迭代器

    import mock
    
    test_list = [1, 2, 3]
    test_mock = mock.Mock(return_value='test', side_effect=test_list)
    print(test_mock())
    print(test_mock())
    print(test_mock())
    print(test_mock())
    
    -----结果-----
    1
    2
    3
    .
    .
        result = next(effect)
    StopIteration
    

      

    4.spec参数:

    4.1指定的是属性组成的list 

    import mock
    test_list = ['age', 'name']
    test_mock = mock.Mock(spec=test_list)
    print(test_mock)
    print(test_mock.age)
    print(test_mock.name)
    -----结果----- <Mock name='mock()' id='4377604560'> <Mock name='mock().age' id='4377604616'> <Mock name='mock().name' id='4377604728'>

     

    4.2指定的是一个类属性:

    class Person:
        _age = 18
    
        def get_age(self):
            print(self._age)
    
        def get_name(self, name):
            print(name)
    
    
    mock_p = mock.Mock(spec=Person)
    print(mock_p)
    print(mock_p.get_age())
    print(mock_p.get_name())
    
    -----结果-----
    <Mock spec='Person' id='4454977832'>
    <Mock name='mock().getage()' id='4456473544'>
    <Mock name='mock().get_name()' id='4456433424'>
    

      

    二、检验mock使用情况

      assert_called_once()                 只调用过一次

      assert_called_once_with()         只调用过一次,且符合参数

      assert_called()                         调用过任意次

      assert_not_called()                   没调用过

      assert_any_call()                      调用过一次即可,且符合参数

      assert_called_with()                 

      举例:

    class Person:
        def __init__(self):
            self.age = 10
    
        def get_full_name(self, first_name, last_name):
            return first_name + ' ' + last_name
    
        def get_age(self):
            return self.age
    
    p = Person()
    p.get_name = mock.Mock(return_value='nee')
    p.get_name()
    p.get_name.assert_not_called()
    
    -----结果-----
    AssertionError: Expected 'mock' to not have been called. Called 1 times.
    

      

  • 相关阅读:
    python+hadoop=?
    Fluentd: The Missing Log Collector
    hadoop streaming 记录
    valgrind备忘
    [hadoop源码阅读][9]mapreduce概论
    GNU Binutils工具
    vim encoding
    [hadoop源码阅读][8]datanodedatanode
    Webdis: HTTP + JSON API for Redis
    gdb 小备注
  • 原文地址:https://www.cnblogs.com/nizhihong/p/10040818.html
Copyright © 2020-2023  润新知