码迷,mamicode.com
首页 > 其他好文 > 详细

py3相对import和mock的问题

时间:2019-12-24 18:43:59      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:coding   介绍   unit   隔离   结构   前言   int   mod   moc   

〇、前言

  本文问题核心:在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的问题

标签:coding   介绍   unit   隔离   结构   前言   int   mod   moc   

原文地址:https://www.cnblogs.com/end-emptiness/p/12013742.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!