如何在python2.7中防止导入(并获得模拟而不是模块)

伊莉亚·苏康尼克(Illia Sukonnik)

我在写单元测试用于MyClassmymodule使用keras.models.load_model每次运行单元测试时,导入keras库都会花费几秒钟并显示以下消息:“使用TensorFlow后端”。这样的行为很烦人。是否有可能防止在python2.7中导入模块(并改为获取Mock())?

mymodule.py:

from keras.models import load_model

class MyClass:
    def __init__(self):
    """I use load_model here"""
...

test_mymodule.py

import unittest

from mock import Mock, MagicMock, patch

from mymodule import MyClass

class MyClassInitializationTestCase(unittest.TestCase):
    def test_my_super_test(self):
...
威尔弗雷德罗斯

尽管我不熟悉keras库,但我认为可以结合使用MagicMock和模块修补来测试工作。

mymodule.py:

import keras


class MyClass(object):
    def __init__(self):
        """I use load_model here"""
        self.example = keras.models.load_model()

test_mymodule.py:

import unittest
import sys
from mock import Mock, MagicMock, patch

sys.modules['keras'] = MagicMock() # as to be done before importing mymodules
from mymodule import MyClass

class MyClassInitializationTestCase(unittest.TestCase):

    @patch('keras.models.load_model')
    def test_my_super_test(self, mock_load_model):
        """ super test """
        fake_return_value = "bar"
        mock_load_model.return_value = fake_return_value
        foo = MyClass()
        self.assertEqual(foo.example, fake_return_value)
        mock_load_model.assert_called_once()

当我运行测试时,我得到了预期的结果:

$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.016s

OK

我将尝试解释更多(我不是单元测试或模拟的专家)。首先,您会注意到我已经更改了您的keras库的导入。这只是为了避免嘲弄keras,然后keras.models又是最后keras.models.load_model我将MagicMock添加到我的可用模块中(我没有安装它)。至于MagicMock,在导入之前keras,我要在导入之前进行说明mymodule

在那之后,我修补keras.models.load_model我的单元测试test_my_super_test您将嘲笑的方法作为测试的属性,我将其命名为attribute mock_load_model您可以使用此模拟方法定义其返回值。那就是我在网上所做的mock_load_model.return_value = fake_return_value当我调用load_model时,该方法将返回fake_return_value其余的都是简单的单元测试。

希望对您有所帮助。对于社区的其他人,如果这有什么不对劲或有更好的解决方法,请纠正我。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何设置“ python”命令指向python2而不是python3?

Python从导入的模块中模拟函数

Python从导入的模块中模拟函数

如何在antrr4中使用python2运行时打印解析树

int()对象如何在Python2中使用不带__eq __()方法的“ ==”运算符?

如何在python2中使用geopandas移动多面体

如何将Syntastic设置为python3检查器而不是python2

如何在Python2中处理可变长度子列表拆包?

如何在vs代码中同时为python2和python3配置pylint

如何在python3程序中使用python2模块

如何在Python2中将utf-8字节数组解码为字符串?

如何将Python2中的file()函数调整为Python3函数?

同时安装python3时,如何管理python2的模块。在OSX中

如何在python2中将str类型的unicode字符串转换为真正的unicode字符串?

如何捕获在python2中在python3中运行的命令的输出?

在Python2中,如何在不明确要求最终用户将其包含的情况下强制子类方法调用父方法?

如何使莳萝在python3中加载python2 pickle

如何在Python2中将字符串转换为字节?

如何在文件而不是模块中模拟func

如何指示 jupyter 使用 python2 而不是 python3

如何在 Sublime Text 中从 Python2 切换到 Python3

如何在 Python2 中遍历 \u2190-\u21FF 的范围

从上述目录导入模块 - Python2

如何在python2中打印出由双引号表示的大小为n的空字符串列表

如何在 Python2 的 Selenium IDE 中更改 firefox 缓存大小的值?

如何在 Ubuntu 中删除 Python2?

如何在pytest中模拟类的模块导入

如何在python3中使用python2 input()函数?

模拟内部方法 Python2