模拟依赖

时间:2020-11-08 09:24:57

标签: python python-3.x magicmock

我是Python新手,正在尝试了解如何在UT中模拟方法。

这是我的考验 test_module2.py

from module2 import A
import unittest

from unittest.mock import patch, MagicMock

class TestBulkLoad(unittest.TestCase):

    @patch('simple_module.SimpleModuleClass')
    def test_fun(self, a):
        a.simpleFun = MagicMock(return_value=3)

        testA = A()
        testA.fun()

        assert a.simpleFun.called

我想检查依赖项SimpleModuleClass是否被模拟并调用

module2.py

from simple_module import SimpleModuleClass


class A:
    def fun(self):
        print('I am from A class')

        thing = SimpleModuleClass()
        thing.simpleFun()

        return -1

simple_module.py

class SimpleModuleClass:
    def simpleFun(self):
        print("I am from SimpleModuleClass")
        return 0

我收到AssertionError。您能帮助我了解如何解决此问题吗?

1 个答案:

答案 0 :(得分:0)

a.simpleFun = MagicMock(return_value=3)

此行仅修改模拟对象a的方法(您实际上应该重命名simpleModuleMock,因为它是SimpleModule类的模拟,而不是{{1} })。它不会在代码中的任何地方模拟A的每个实例,因此为什么在SimpleModule中实例化SimpleModule的实例而不是A.fun()的模拟实例。

我将使用依赖注入并将SimpleModule的实例传递给SimpleModule,而不是在其内部实例化它,以便您可以传递模拟。您还可以像这样将A.fun()设置为公共变量:

test_module2.py

thing

module2.py

class TestBulkLoad(unittest.TestCase):
    @patch('simple_module.SimpleModuleClass')
    def test_fun(self, simpleModuleMock):
        simpleModuleMock.simpleFun = MagicMock(return_value=3)

        testA = A()
        A.thing = simpleModuleMock
        assert(testA.fun() == -1)

        # assert simpleModule.simpleFun.called
        assert isinstance(simpleModuleMock.simpleFun, MagicMock)

请注意,使用Python可能存在更好的解决方案,但如果有的话,1.我不知道它们,以及2.我怀疑它们是好的做法。

相关问题