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.