模拟依赖
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. 我怀疑它们是否是好的做法。
我是 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. 我怀疑它们是否是好的做法。