25

Python で簡単なテストを作成しようとしていますが、モック プロセスを実行する方法がわかりません。

これはクラスと定義のコードです:

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 で行ったことはありません。

4

2 に答える 2

38

unittest.mock最初に、ドキュメントに記載されているように、モックアウトしようとしているものが使用されている場合は常にモックする必要があることを理解することが非常に重要です。

基本的な原則は、オブジェクトがルックアップされる場所にパッチを適用することです。これは、オブジェクトが定義されている場所と必ずしも同じ場所ではありません。

次に行う必要があるのは、パッチを適用したオブジェクトのMagicMockインスタンスを返すことです。return_valueしたがって、これを要約するには、次のシーケンスを使用する必要があります。

  • パッチ オブジェクト
  • 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) 
于 2016-08-17T19:34:26.490 に答える