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

Ill*_*nik 6 python-2.7

我正在MyClass为该mymodule用途 编写单元测试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"""
...
Run Code Online (Sandbox Code Playgroud)

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):
...
Run Code Online (Sandbox Code Playgroud)

小智 5

虽然我不熟悉 keras lib,但我认为您可以通过结合使用 MagicMock 和模块修补来测试工作。

mymodule.py:

import keras


class MyClass(object):
    def __init__(self):
        """I use load_model here"""
        self.example = keras.models.load_model()
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

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

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

OK
Run Code Online (Sandbox Code Playgroud)

我会尝试解释更多(我不是单元测试或模拟方面的专家)。首先,您会注意到我已经更改了 keras 库的导入。这只是为了避免keras嘲笑。我将 MagicMock 添加到我的可用模块中(我没有安装它)。MagicMock至于要在导入之前,我先介绍一下导入之前的情况。keras.modelskeras.models.load_modelkerasmymodule

之后,我keras.models.load_model为我的单元测试打补丁test_my_super_test。您收到模拟方法作为测试的属性,我已将该属性命名为mock_load_model。您可以使用此模拟方法来定义其返回值。这就是我在网上所做的mock_load_model.return_value = fake_return_value。当我调用 load_model 时,该方法将返回fake_return_value。剩下的就是简单的单元测试。

希望有帮助。对于社区的其他人,如果有问题或者有更好的方法,请纠正我。