py3相对import和mock的问题
Posted end-emptiness
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了py3相对import和mock的问题相关的知识,希望对你有一定的参考价值。
〇、前言
本文问题核心:在python3 相对路径import的情况下,mock对应的模块,导致对应模块内其他模块导入错误。
一、问题描述
测试用例结构:
a.py:
# -*- coding: utf-8 -*- import jiliguala def afunc(): print("this func a")
b.py:
# -*- coding: utf-8 -*- from . import a def bfunc(): a.afunc() print("this func b")
core.py:
# -*- coding: utf-8 -*- import unittest import unittest.mock as mock def test_post(x): print("do test http: ", x) @mock.patch.dict("sys.modules", { "test.a": mock.Mock(), }) class TestCore(unittest.TestCase): @mock.patch("a.afunc") def test1(self, test_post): import test.b as b b.bfunc() test_post.side_effect = test_post b.bfunc() @mock.patch("c.cpost") def test2(self, test_post): import test.c as c c.cfunc() test_post.side_effect = test_post c.cHttp()
简单介绍一下,a文件是非py服务(用了一些莫名其妙的模块),b依赖于a,因此我在测试b中的代码需要将a进行隔离。
在core代码中用装饰器的方式,将a模块隔离(from . import a这种写法,在sys.modules中就是test.a的形式),然后重写a.afunc的代码。
好,看代码逻辑,貌似没什么问题。
结果:
我把整个a模块都mock了,怎么还会导入a里面的模块?
写一个空的测试类,看看有没有mock
结果:
成功mock进去了……
问题猜测:估计是我神奇的写法有问题。
没错!如果直接mock那个神奇的模块的话,一点问题没有,但是如果确实有这么一个模块,用到了很多其他py命令行无法调用的模块的话,还是这种写法更好一点。
二、系统路径的存放方式
三、mock方法,导入对应路径的方式
主要描述,mock只是在sys.modules里面加了对应的字典值,并附上了Mock实例
四、问题的根本原因
五、解决方法
DLC、py2和py3 import的区别
主要描述为什么py3不支持直接import包内模块
以上是关于py3相对import和mock的问题的主要内容,如果未能解决你的问题,请参考以下文章