在 python class 之外修补一个方法

Patch a method outside python class

我有兴趣修补一个文件中被另一个方法调用的方法。示例 - original.py 文件包含 -

def A():
   a = 10
   b = 5
   return a*b;

def B():
  c = A()
  return c* 10

我想为这个文件编写单元测试,比如调用它 test.py

import mock
import unittest

class TestOriginal(unitest.TestCase):
    def test_Original_method(self):
       with patch(''):

如何使用补丁和模拟模块来测试 original.py。我希望 A() 始终 return MagicMock() 对象而不是整数。

您只需修补被测模块中的 A 全局变量。我会在这里使用 @patch 装饰器语法:

import mock
import unittest
import module_under_test

class TestOriginal(unitest.TestCase):
    @patch('module_under_test.A')
    def test_Original_method(self, mocked_A):
        mocked_A.return_value = 42
        result = module_under_test.B()
        mocked_A.assert_called_with()
        self.assertEqual(result, 420)

这将 A()MagicMock 模拟对象作为测试方法的额外参数传入。

请注意,我们在这里明确命名了模块。您也可以使用 patch.object(),只需命名模块上的属性(这是您的模块全局变量):

class TestOriginal(unitest.TestCase):
    @patch.object(module_under_test, 'A')
    def test_Original_method(self, mocked_A):
        mocked_A.return_value = 42
        result = module_under_test.B()
        mocked_A.assert_called_with()
        self.assertEqual(result, 420)

当然,您仍然可以使用 with 语句:

class TestOriginal(unitest.TestCase):
    def test_Original_method(self):
        with patch('module_under_test.A') as mocked_A:
            mocked_A.return_value = 42
            result = module_under_test.B()
            mocked_A.assert_called_with()
            self.assertEqual(result, 420)