mock.patch 在 with 语句的范围之外泄漏模拟对象

问题描述 投票:0回答:1

我在文件夹controller/下有以下三个python文件

  1. 数学.py
class Math:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def addition(self):
        return self.a + self.b
  1. 计算.py
from controller.math import Math


def perform_addition():
    math = Math(1, 2)
    return math.addition()
  1. 测试样本.py
from unittest.mock import MagicMock, patch

def test_addition():


    mock_math = MagicMock()

    with patch('controller.math.Math', return_value=mock_math) as MockClass:
        instance = MockClass.return_value

        instance.addition.return_value = 100

        from controller.calculation import perform_addition
        output = perform_addition()

        print(output)  # prints 100

    post_patch_output = perform_addition()
    print(post_patch_output)  # prints 100 but expected 3

当我执行 test_addition 时,我期望

post_patch_output
返回 3,但它返回 100,即模拟输出。我很好奇我在这里错过了什么?

从mock.patch的文档这里,它说

When the function/with statement exits the patch is undone.
这看起来不像这里的情况

python mocking python-unittest patch
1个回答
0
投票

功能修正
test_addition

您必须修改文件

test_sample.py
,如下所示:

from unittest.mock import MagicMock, patch
from controller.calculation import perform_addition

def test_addition():

    mock_math = MagicMock()

    #with patch('controller.math.Math', return_value=mock_math) as MockClass:
    with patch('controller.calculation.Math', return_value=mock_math) as MockClass:
        instance = MockClass.return_value

        instance.addition.return_value = 100

        #from controller.calculation import perform_addition
        output = perform_addition()
        print(output)  # prints 100

    post_patch_output = perform_addition()
    print(post_patch_output)  # prints 100 but expected 3

test_addition()

这是执行

test_addition()
的输出:

100
3

如你所料。

代码中的错误

  • 您必须在文件
    Math
    内而不是在
    calculation.py
     内修补由名称 
    math.py
  • 引用的对象
  • 之前的修改就足够了,但我更喜欢在文件顶部执行导入
    from controller.calculation import perform_addition
    ,而不是在方法内部
    test_addition
© www.soinside.com 2019 - 2024. All rights reserved.