私は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)
executeメソッドは接続を確立しようとするので、それをモックする必要があります。実際の接続を確立したくないので、何かモックを返します。どうすれば作成できますか?私はJavaでテストを行うのに慣れていますが、Pythonでは行っていません。
まず、unittest.mock
のドキュメントに記載されているように、モックアウトしようとしているものが使用されている場合は常にモックする必要があることを理解することが非常に重要です。
基本的な原則は、オブジェクトが検索される場所にパッチを適用することです。これは、オブジェクトが定義されている場所と同じ場所であるとは限りません。
次に、パッチを適用したオブジェクトのreturn_value
としてMagicMock
インスタンスを返す必要があります。したがって、これを要約するには、次のシーケンスを使用する必要があります。
MagicMock
を準備するMagicMock
をreturn_value
として返しますここにプロジェクトの簡単な例があります。
connection.py(モックしたいクラス)
class Connection(object):
def execute(self):
return "Connection to server made"
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
tests/test_file.py
import unittest
from unittest.mock import patch, MagicMock
from project.file import FileRemoveOp
class TestFileRemoveOp(unittest.TestCase):
def setUp(self):
self.fileremoveop = FileRemoveOp('foobar')
@patch('project.file.Connection')
def test_execute(self, connection_mock):
# Create a new MagickMock instance which will be the
# `return_value` of our patched object
connection_instance = MagicMock()
connection_instance.execute.return_value = "testing"
# Return the above created `connection_instance`
connection_mock.return_value = connection_instance
result = self.fileremoveop.execute()
expected = "testing"
self.assertEqual(result, expected)
def test_not_mocked(self):
# No mocking involved will execute the `Connection.execute` method
result = self.fileremoveop.execute()
expected = "Connection to server made"
self.assertEqual(result, expected)