我想了解如何@patch从导入的模块中获取功能。
@patch
这是我到目前为止的地方。
应用程序/模拟.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"
测试/模拟测试.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()
这不像我预期的那样工作 。 “已修补”模块仅返回get_user_name. 如何模拟要导入到正在测试的命名空间的其他包中的方法?
get_user_name
当您使用包中的patch装饰器时,您是在正在测试的命名空间(在这种情况下)中 修补它* ,而不是从导入函数的命名空间(在这种情况下)。unittest.mock *app.mocking.get_user_name``app.my_module.get_user_name
patch
unittest.mock
app.mocking.get_user_name``app.my_module.get_user_name
要执行您描述的操作,请@patch尝试以下操作:
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')
标准库文档包含一个有用的部分来描述这一点。