模拟依赖

Mocking dependencies

我是 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

我收到断言错误。你能帮我了解如何解决这个问题吗?

a.simpleFun = MagicMock(return_value=3)

这一行只是修改你的模拟对象 a 的方法(你真的应该重命名 simpleModuleMock,因为它是 SimpleModule class 的模拟并且不是 A)。它不会在您的代码中到处模拟 SimpleModule 的每个实例,因此为什么 SimpleModule 的实例在 A.fun() 中实例化而不是 SimpleModule 的模拟实例。

我会使用依赖注入并将 SimpleModule 的实例传递给 A.fun() 而不是在其中实例化它,这样您就可以传递模拟。您也可以像这样使 thing 成为 public 变量:

test_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)

module2.py:

class A:
    thing = SimpleModuleClass()
    def fun(self):
        print('I am from A class')
        self.thing.simpleFun()
        return -1

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