使用 pytest-mock mocker 来模拟对象结构

时间:2021-05-24 08:08:07

标签: python unit-testing mocking pytest

我正在尝试使用 pytest-mock 来模拟测试创建对象的函数:

from unittest.mock import MagicMock
class A():
    def __init__(self, a: int):
        print('A', a)

def my_fun(a: int):
    return A(a)

def test_me(mocker):
    mocker.patch(f'{__name__}.A.__new__', new_callable=lambda: MagicMock(spec_set=A))
    o1 = my_fun(1)
    print('o1', o1)
    o2 = my_fun(2)
    print('o2', o2)
    

输出为:

o1 <MagicMock name='mock()' id='140737208963280'>
o2 <MagicMock name='mock()' id='140737208963280'>

我希望 o1 和 o2 持有 2 个不同的 MagicMock 对象,但看起来我得到了相同的对象。我做错了什么吗?

1 个答案:

答案 0 :(得分:0)

我现在找到了问题所在。代码应该是:

from unittest.mock import MagicMock
class A():
    def __init__(self, a: int):
        print('A', a)

def my_fun(a: int):
    return A(a)

def test_me(mocker):
    mocker.patch(f'{__name__}.A.__new__', side_effect=lambda *args, **kwargs: MagicMock(spec_set=A))
    o1 = my_fun(1)
    print('o1', o1)
    o2 = my_fun(2)
    print('o2', o2)

输出:

o1 <MagicMock spec_set='A' id='140737208906384'>
o2 <MagicMock spec_set='A' id='140737209072976'>