在python的sys模块中、函数_python – 如何模拟从函数导入但在sys.path中不存在的模块?...

参见英文答案 > python: mock a module                                    4个

我正在对包含执行本地导入的方法的代码进行单元测试.

def function_under_test():

import unknown.dependency

(我没有在.py文件的顶部使用导入,因为在调用该函数时它可能存在也可能不存在.)

以通常的方式模拟unknown.dependency只有在sys.path中可以找到它时才有效.否则,对补丁的调用失败(它拒绝模拟它看不到的东西):

with mock.patch('unknown.dependency'):

function_under_test()

>>> ImportError: No module named 'unknown'

文档建议我应该修补使用模块的命名空间 – 在本例中为function_under_test.但是,当该命名空间是一个函数时,这不会削减它.对补丁的调用成功,但实际的import语句仍然引用原始的,不存在的未知模块,该模块无法找到.

with mock.patch('method_under_test.unknown'):

print("fails")

>>> ImportError: No module named 'unknown'

那么,如果模块本身不存在并且从函数导入,如何用模拟替换依赖模块呢?

解决方法:

只模拟导入

简单的方法是将import语句移动到单独的函数中.

def get_dependency():

import unknown.dependency

return unknown.dependency

def function_under_test():

module = get_dependency()

# use module

这样可以很容易地模拟出“帮助”功能.这样做的缺点是需要更改被测代码.它确实有效:

with mock.patch('get_dependency'):

function_under_test()

模拟模块

如here所述,您可以将模拟模块直接添加到sys.modules,以便Python可以找到它,无论它是否存在于sys.path中.

with mock.patch.dict('sys.modules', unknown=mock.MagicMock()):

function_under_test()

标签:python,mocking,python-unittest

来源: https://codeday.me/bug/20190611/1218121.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值