1

「手続き型」関数によって呼び出されるオブジェクトメソッドでコンストラクターの呼び出しをモックするのに苦労しています。

理解を深めるために、短いバージョンとしての私のコードを次に示します。

ファイル ./src/b/lambda_function.py:

from src.b.oee_retriever import OeeRetriever

oee_retriever = OeeRetriever()
def handler(event, context):
  return oee_retriever.call_repo()

ファイル ./src/b/oee_retriever.py:

from src.b.oee_repo import OeeRepo
class OeeRetriever():
  oee_repo = None

  def __init__(self):
    self.oee_repo = OeeRepo()
    print('Type: ' + str(type(self.oee_repo)))
  
  def call_repo(self):
    print('calling repo')
    return self.oee_repo.do()

今、関数をテストしたいだけで、コンストラクター呼び出しをモックしたいlambda_function.handler()OeeRepo()oee_retriever.__init__()

私は試した:

from unittest import TestCase
from unittest.mock import Mock, patch

from src.b.lambda_function import handler

class OeeLambdaFunctionTest(TestCase):

  @patch('src.b.oee_repo.OeeRepo')
  def test_bar(self, oee_repo):
    my_mock = Mock()
    my_mock.do.return_value = 'nope'
    oee_repo.return_value = my_mock

    result = handler(None, None)
    self.assertEqual(result, 'nope')

モックされた結果は「いいえ」になるはずですが、oee_repo.do()代わりに実際の関数が呼び出されます。私も使用しようとしまし@patch('src.b.oee_retriever.OeeRepo')たがoee_repo.do()、この場合も呼び出されました。

OeeRepo()コンストラクター呼び出しをモックするにはどうすればよいですか?

4

0 に答える 0