Python模拟对象实例化

标签 python unit-testing mocking

使用 Python 2.7 和模拟库

我如何使用 mock 测试某个修补对象是否已使用某些特定参数进行了初始化?

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

单元测试.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...

我的库文件:

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.assert_called_with() :

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

为了说明,我已将您的 MCVE 更新为一个工作示例:

测试.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

关于Python模拟对象实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35803914/

相关文章:

python - 使用 Python 渲染 TTF 字形

c# - NUnit 不遵守属性继承

javascript - enzyme 测试同一组件内的多种渲染方法

c# - 如何对 MVC UserViewControl 进行单元测试?

c++ - 使用 Pimpl 模式的模拟类

testing - 最新的 Groovy 稳定版本令人费解的问题

python - 命名从 CountVectorizer Vector 创建的 DataFrame 列

php - 在 Python 中存储唯一字符

python - S3Cmd参数问题: Nothing to upload error

javascript - 我什么时候需要在 Jasmine 中使用 beforeEach block ?