我试图在python中进行一个简单的测试,但是我无法弄清楚如何完成模拟过程。
这是类和def代码:
class FileRemoveOp(...)
@apply_defaults
def __init__(
self,
source_conn_keys,
source_conn_id='conn_default',
*args, **kwargs):
super(v4FileRemoveOperator, self).__init__(*args, **kwargs)
self.source_conn_keys = source_conn_keys
self.source_conn_id = source_conn_id
def execute (self, context)
source_conn = Connection(conn_id)
try:
for source_conn_key in self.source_keys:
if not source_conn.check_for_key(source_conn_key):
logging.info("The source key does not exist")
source_conn.remove_file(source_conn_key,'')
finally:
logging.info("Remove operation successful.")
这是我对执行功能的测试:
@mock.patch('main.Connection')
def test_remove_execute(self,MockConn):
mock_coon = MockConn.return_value
mock_coon.value = #I'm not sure what to put here#
remove_operator = FileRemoveOp(...)
remove_operator.execute(self)
由于执行方法尝试建立连接,我需要嘲笑,我不想做一个真正的连接,只是返回一些模拟。我该怎么做?我曾经习惯用Java进行测试,但我从未在python上做过测试..
答案 0 :(得分:13)
首先,非常重要的是要了解你总是需要模拟你试图模仿的东西,如unittest.mock
文档中所述。
基本原则是你修剪一个对象的位置, 它不一定与定义它的位置相同。
接下来,您需要做的是将MagicMock
实例作为已修补对象的return_value
返回。总而言之,您需要使用以下序列。
MagicMock
MagicMock
这是一个项目的快速示例。
connection.py(我们想要模拟的课程)
return_value
file.py(使用类的地方)
class Connection(object):
def execute(self):
return "Connection to server made"
<强>测试/ test_file.py 强>
from project.connection import Connection
class FileRemoveOp(object):
def __init__(self, foo):
self.foo = foo
def execute(self):
conn = Connection()
result = conn.execute()
return result
答案 1 :(得分:0)
我发现这个简单的解决方案可在python3中使用:您可以在首次导入整个类之前替换整个类。说我必须从real.manager模拟类'Manager'
class MockManager:
...
import real.manager
real.manager.Manager = MockManager
如果没有更好的位置,可以在 init .py中进行此替换。 它也可以在python2中工作,但我没有检查。