2016-08-17 9 views
5

私は単純なテストをパイソンで作ろうとしていますが、私はモックプロセスをどのように達成するかを理解できません。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) 

メソッドを実行するので、私が必要とする、接続を試みますそれを嘲笑するために、私は本当のつながりを作りたいと思うのではなく、ちょうど何か偽物を返す。どうしたらいいですか?で述べたように、あなたはいつもあなたがモックしようとしているものが使用される場合に、それをモックする必要があることを理解することが非常に重要である

+1

実際に何をテストしようとしていますか?通常は、テストしているコードによって呼び出され、モックを直接呼び出さないものを嘲笑しています。あなたのアプローチではモックだけをテストします。 –

+0

より完全な例が便利です。あなたが達成しようとしていることを判断するのは難しいです。それは嘲笑クラスは、それが自動的に返されたインスタンスとして別のモックを作成する呼び出されたときに、言いました。必要に応じて、この模擬接続を設定することができます。 – Dunes

答えて

8

まず..私はJavaでテストを行うために使用していますが、私は、Pythonでやったことはありませんunittest.mockのドキュメント。

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

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

  • Patchオブジェクト
  • 準備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  

テスト/ 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) 
+0

ありがとう!これは完璧な例であり、正しく動作します! :) – AnaF

関連する問題