简体   繁体   English

Python 模拟对象实例化

[英]Python mock object instantiation

Using Python 2.7, and mock library使用 Python 2.7 和模拟库

How can I test that certain patched object has been initialized with some specific arguments using mock?如何使用模拟测试某些已修补的对象是否已使用某些特定参数初始化?

Here some sample code and pseudo-code:这里有一些示例代码和伪代码:

unittest.py :单元测试.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 : mylib.py :

from someobjectmodule import SomeObject
def method_to_test():
  obj = SomeObject(arg1=val1, arg2=val2, arg3=val3)
  obj.method_inside_someobject()

So, how can I test SomeObject was instanced with arg1=val1, arg2=val2, arg3=val3?那么,我如何测试 SomeObject 是否使用 arg1=val1、arg2=val2、arg3=val3 进行实例化?

If you replaced a class with a mock, creating an instance is just another call. 如果用mock替换了类,则创建实例只是另一个调用。 Assert that the right parameters have been passed to that call, for example, with mock.assert_called_with() : 断言正确的参数已传递给该调用,例如,使用mock.assert_called_with()

mock_someobject.assert_called_with(arg1=val1, arg2=val2, arg3=val3)

To illustrate, I've updated your MCVE to a working example: 为了说明,我已将您的MCVE更新为一个工作示例:

test.py : 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 : 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 : someobjectmodule.py

class SomeObject(object):
    def method_inside_someobject(self):
        return 'The real thing'

and running the test: 并运行测试:

$ python test.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

doesn't work for me.对我不起作用。 the Object isn't mocked对象没有被嘲笑

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM