我是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。您能帮助我了解如何解决此问题吗?
答案 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.我怀疑它们是好的做法。