我是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。我怀疑它们是否是好的练习。