虽然我不熟悉的keras lib中,我认为,你可以让你测试工作用的组合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
。您收到您的模拟方法作为测试的属性,我已将其属性命名为mock_load_model
。你可以使用这个模拟方法来定义它的返回值。这就是我在mock_load_model.return_value = fake_return_value
上所做的。当我将调用load_model时,该方法将返回fake_return_value
。剩下的就是单元测试。
希望它有帮助。 对于社区的其他人,如果有问题或者有更好的方法,请纠正我的错误。
非常感谢。 我以前试过'sys.modules ['keras'] = MagicMock()'但是这会引发一个错误。 不改变mymodule.py我宁愿模拟所有keras子模块,像这样: 'sys.modules中[ 'keras'] = MagicMock()'' sys.modules中[ 'keras.models'] = MagicMock( )' 'sys.modules ['keras.models.load_model'] = MagicMock()' –
不错,这也是可行的,因为我在说。如果您没有其他问题,请将您的问题解决。 – wilfriedrt