模拟依赖关系



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

这是我的测试测试模块2.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的每个实例,因此SimpleModule的实例在A.fun()中实例化,而不是SimpleModule的模拟实例。

我将使用依赖注入,并将SimpleModule的实例传递给A.fun(),而不是在其中实例化它,这样您就可以传递mock。您也可以使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。我怀疑它们是否是好的练习。

相关内容

  • 没有找到相关文章

最新更新