如何在Python中模拟实例方法

时间:2019-03-14 21:21:00

标签: python python-3.x unit-testing mocking

我正在尝试测试一个类并模拟它的一种方法,但是我似乎无法用我的模拟行为来代替一种实例方法的行为。我的代码是这样组织的:

--src ----module ------__init__.py ------my_class.py --tst ----__init__.py ----test_my_class.py

my_class.py包含以下内容

class MyClass:

    def __init__(self):
        pass

    def do_something(self):
        return 'Real Output'

我的测试文件test_my_class.py包含以下内容。

from unittest.mock import patch
from src.module.my_class import MyClass

def test_my_class():
    my_class = MyClass()
    assert my_class.do_something() == 'Real Output'

@patch('src.module.my_class.MyClass')
def test_mock_my_class(mock_my_class):
    mock_my_class.return_value.do_something.return_value = 'Mocked Output'
    my_class = MyClass()
    assert my_class.do_something() == 'Mocked Output'

第一个测试工作正常(到目前为止,不涉及任何模拟)。但是,第二项测试给了我以下断言错误。我希望do_something()方法被模拟并返回“模拟输出”,并且assert语句的评估结果为true。我在哪里错了?

AssertionError: assert <bound method MyClass.do_something of <src.module.my_class.MyClass object at 0x1057133c8>> == 'Mocked Output' E + where <bound method MyClass.do_something of <src.module.my_class.MyClass object at 0x1057133c8>> = <src.module.my_class.MyClass object at 0x1057133c8>.do_something

PS。我已经咨询了以下资源,但没有成功:

最后一个链接乍一看似乎特别有用,因为我几乎逐字跟踪了其中一个示例,但仍然无法正常工作。

@mock.patch("simple.SimpleClass")
def mock_simple_class(mock_class):
    mock_class.return_value.explode.return_value = "BOO!"
    inst = simple.SimpleClass()
    result = inst.explode()
    print(result)

1 个答案:

答案 0 :(得分:0)

一种更合适的解决方法是使用patch.object

@patch.object(MyClass, "do_something")
def test_mock_my_class(m):
    m.side_effect = ['Mocked Output']
    my_class = MyClass()
    assert my_class.do_something() == 'Mocked Output'