在 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)
我有兴趣修补一个文件中被另一个方法调用的方法。示例 - 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)