Python模拟对象实例化

16

使用Python 2.7和mock库

我如何使用mock来测试已经被patch的对象是否初始化了特定的参数?

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

unittest.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实例化的?


1
你难道不只是要使用 assert_called_with 吗? - mgilson
让我编辑问题以展示一些示例代码。我尝试过assert_called_with,但没有得到结果。 - Javier Novoa C.
在这里... @mgilson,我添加了一些示例代码。谢谢! - Javier Novoa C.
method_inside_someobject是什么?你是不是想在那里使用test1?为什么要重新绑定test1 - Martijn Pieters
此外,您修补 SomeObject 的方式是正确的,这意味着您一定会看到 SomeObject.assert_called_with() 起作用。您能否确保您的 [mcve] 正确反映了您的情况,并且可以正常工作? - Martijn Pieters
1个回答

29

如果你用一个 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接