2016-08-17 2 views
5

파이썬으로 간단한 테스트를하려하지만 조롱 프로세스를 수행하는 방법을 알아낼 수 없습니다. 전체 파이썬 클래스 모의

클래스와 데프 코드 :

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로 테스트를 해본 적이 있지만 파이썬에서는 사용하지 않았습니다.

+1

당신은 실제로 무엇을 시험하려고합니까? 일반적으로 테스트중인 코드에 의해 호출되고 모의 객체를 직접 호출하지 마십시오. 당신의 접근 방식으로 당신은 가짜만을 테스트 할 것입니다. –

+0

더 완전한 예가 유용 할 것입니다. 당신이 달성하고자하는 것을 측정하는 것은 어렵습니다. 즉, 조롱 된 클래스가 호출되면 반환 된 인스턴스로 자동으로 다른 모의 객체가 만들어집니다. 그런 다음 필요에 따라 조롱 된 연결을 설정할 수 있습니다. – Dunes

답변

8

먼저 모의해볼 필요가있는 곳을 모의해야한다는 것을 이해하는 것이 중요합니다. unittest.mock 문서.

기본 원리는 객체가 검색된 위치를 패치하는 것입니다. 은 정의 된 위치와 반드시 동일하지는 않습니다.

은 다음 무엇을 당신이 할 필요하면 패치 된 개체의 return_valueMagicMock 인스턴스를 반환하는 것입니다. 따라서 이것을 요약하려면 다음 시퀀스를 사용해야합니다.

  • 패치 개체
  • 준비 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

관련 문제