[英]How do you mock patch a python class and get a new Mock object for each instantiation?
[英]Python mock object instantiation
使用 Python 2.7 和模拟库
如何使用模拟测试某些已修补的对象是否已使用某些特定参数初始化?
这里有一些示例代码和伪代码:
单元测试.py:
import mock
@mock.patch('mylib.SomeObject')
def test_mytest(self, mock_someobject):
test1 = mock_someobject.return_value
test1 = method_inside_someobject.side_effect = ['something']
mylib.method_to_test()
# How can I assert that method_to_test instanced SomeObject with certain arguments?
# I further test things with that method_inside_someobject call, no problems there...
mylib.py :
from someobjectmodule import SomeObject
def method_to_test():
obj = SomeObject(arg1=val1, arg2=val2, arg3=val3)
obj.method_inside_someobject()
那么,我如何测试 SomeObject 是否使用 arg1=val1、arg2=val2、arg3=val3 进行实例化?
如果用mock替换了类,则创建实例只是另一个调用。 断言正确的参数已传递给该调用,例如,使用mock.assert_called_with()
:
mock_someobject.assert_called_with(arg1=val1, arg2=val2, arg3=val3)
为了说明,我已将您的MCVE更新为一个工作示例:
test.py :
import mock
import unittest
import mylib
class TestMyLib(unittest.TestCase):
@mock.patch('mylib.SomeObject')
def test_mytest(self, mock_someobject):
mock_instance = mock_someobject.return_value
mock_instance.method_inside_someobject.side_effect = ['something']
retval = mylib.method_to_test()
mock_someobject.assert_called_with(arg1='foo', arg2='bar', arg3='baz')
self.assertEqual(retval, 'something')
if __name__ == '__main__':
unittest.main()
mylib.py :
from someobjectmodule import SomeObject
def method_to_test():
obj = SomeObject(arg1='foo', arg2='bar', arg3='baz')
return obj.method_inside_someobject()
someobjectmodule.py :
class SomeObject(object):
def method_inside_someobject(self):
return 'The real thing'
并运行测试:
$ python test.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
对我不起作用。 对象没有被嘲笑
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.