在python类之外修补方法

时间:2015-08-27 22:25:35

标签: python mocking patch python-unittest magicmock

我感兴趣的是修补一个文件中另一个方法调用的方法。示例 - 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()总是返回MagicMock()对象而不是整数。

1 个答案:

答案 0 :(得分:1)

您只需在被测模块中修补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)

这会传递MagicMock的{​​{1}}模拟对象作为测试方法的额外参数。

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

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