python 导入模块中的特定函数_Python从导入的模块中嘲弄一个函数

本文档介绍了如何在Python单元测试中使用`unittest.mock`库的`patch`装饰器来模拟(mock)从外部模块导入的函数。通过修改测试代码中的patch调用,将模拟功能直接应用到测试的局部作用域,确保函数在测试期间被正确替换。示例代码展示了如何使用`with`语句实现模拟,并展示了如何在测试中验证模拟函数的返回值。
摘要由CSDN通过智能技术生成

Python从导入的模块中嘲弄一个函数

我想了解如何从一个导入的模块中@patch一个函数。

这是我到目前为止。

应用程序/ mocking.py:

from app.my_module import get_user_name def test_method(): return get_user_name() if __name__ == "__main__": print "Starting Program..." test_method()

应用程序/ my_module / __ init__.py:

def get_user_name(): return "Unmocked User"

testing/ mock-test.py:

import unittest from app.mocking import test_method def mock_get_user(): return "Mocked This Silly" @patch('app.my_module.get_user_name') class MockingTestTestCase(unittest.TestCase): def test_mock_stubs(self, mock_method): mock_method.return_value = 'Mocked This Silly') ret = test_method() self.assertEqual(ret, 'Mocked This Silly') if __name__ == '__main__': unittest.main()

这不符合我的预期。 “patched”模块只是简单地返回get_user_name的unmocked值。 我如何从其他包中导入到被测命名空间中的方法进行模拟?

当您使用unittest.mock包中的patch修饰符时,您不修补从模块导入的名称空间(在本例中为app.my_module.get_user_name ),而是将其修补到testing下的名称空间app.mocking.get_user_name 。

使用Mock来完成上述操作,如下所示:

from mock import patch from app.mocking import test_method class MockingTestTestCase(unittest.TestCase): @patch('app.mocking.get_user_name') def test_mock_stubs(self, test_patch): test_patch.return_value = 'Mocked This Silly' ret = test_method() self.assertEqual(ret, 'Mocked This Silly')

标准的库文档包括一个有用的部分描述这一点。

虽然马蒂约翰的答案解决了你的问题(也帮助了我,谢谢!),但是,我会build议本地化replace原来的'get_user_name'函数与嘲笑的。 这将允许您控制何时更换function以及何时不更换function。 此外,这将允许您在同一个testing中做几个replace。 为了做到这一点,请以相当相似的方式使用'with'语句:

from mock import patch class MockingTestTestCase(unittest.TestCase): def test_mock_stubs(self): with patch('app.mocking.get_user_name', return_value = 'Mocked This Silly'): ret = test_method() self.assertEqual(ret, 'Mocked This Silly')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值