繁体   English   中英

模拟依赖

[英]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被模拟和调用

模块2.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类的模拟而不是A )。 它不会在代码中的任何地方模拟SimpleModule每个实例,因此为什么在A.fun()实例化SimpleModule的实例而不是SimpleModule的模拟实例。

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

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)

模块2.py

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM