Python模拟对象实例化

时间:2016-03-04 18:55:09

标签: python unit-testing mocking

使用Python 2.7和模拟库

如何使用mock?

测试某些特定参数是否初始化了某个修补对象?

这里有一些示例代码和伪代码:

unittest.py:

ALTER TABLE quiz ADD rank INT AUTO_INCREMENT;

mylib.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...

那么,我怎样才能测试SomeObject是用arg1 = val1,arg2 = val2,arg3 = val3来实例化的?

1 个答案:

答案 0 :(得分:4)

如果用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