如何从外部模块模拟base_class?

时间:2019-10-30 15:44:24

标签: python unit-testing mocking

我正在尝试对从外部模块中的base_class派生的类进行单元测试。在我的开发/测试环境中,我无法访问此外部模块,这意味着我必须以某种方式模拟此base_class。

我的测试代码与我要测试的代码位于不同的文件中。

问题可以总结如下:

my_class.py

import external_module

class MyClass(external_module.ExternalClass):
    def test_method(self):
        return "successful"

test_my_class.py

import sys
import unittest
from unittest.mock import MagicMock

sys.modules['external_module'] = MagicMock()

from my_class import MyClass

class TestMyClass(unittest.TestCase):
    def test_first(self):
        my_class = MyClass()
        result = my_class.test_method()
        self.assertEqual(result, "successful")

if __name__ == '__main__':
    unittest.main()

结果


运行test_my_class.py时,结果如下。

AssertionError: <MagicMock name='mock.ExternalClass.test_method()' id='140272215184664'> != 'successful'

很显然,因为external_module是模拟的,所以即使MyClass也成为模拟对象的实例。

类似帖子


该问题与Python mock: mocking base class for inheritance中所述的问题类似,但不同之处在于base_class来自外部模块。

即使How to mock a base class with python mock library与我的问题也有相似之处,尽管不能直接应用解决方案。

尝试和失败


要获取导入

import external_module

my_class.py

中工作
sys.modules['external_module'] = MagicMock()

需要在 test_my_class.py 中设置。

尽管如此,这导致该external_module。*成为一个Mock实例。

1 个答案:

答案 0 :(得分:0)

您可以创建一个辅助模块mocked_external_module,该模块可以从测试中导入,并且还包含一个类base_class。然后,在测试代码中执行以下操作:

import mocked_external_module
sys.modules['external_module'] = mocked_external_module

此外,您需要模拟的base_class中的每种方法都可以创建为Mock或MagicMock。