2016-08-17 12 views
5

Próbuję zrobić prosty test w Pythonie, ale nie jestem w stanie dowiedzieć się, jak wykonać kpiny.Makiety cały python klasa

Jest to klasa i def Kod:

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.") 

I to jest mój test do wykonywania funkcji:

@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) 

Od wykonać sposób próbują nawiązać połączenie, muszę kpić z tego, nie chcę nawiązać prawdziwego połączenia, po prostu zwróć coś z siebie. Jak mogę to zrobić? Jestem przyzwyczajony do testowania w Javie, ale nigdy nie zrobiłem tego na python ..

+1

Co właściwie próbujesz przetestować? Zazwyczaj kpisz z rzeczy, które wywołuje kod, który testujesz, i nie wywołują tego bezpośrednio. Dzięki swojemu podejściu testujesz tylko próbę. –

+0

Bardziej kompletny przykład byłby przydatny. Trudno jest ocenić, co próbujesz osiągnąć. To powiedziawszy, kiedy wyśmiewana klasa zostanie wywołana, automatycznie utworzy kolejną próbę jako zwróconą instancję. W razie potrzeby możesz skonfigurować to wyśmiewane połączenie. – Dunes

Odpowiedz

8

Po pierwsze, bardzo ważne jest, aby zrozumieć, że zawsze trzeba udawać, gdzie to, co próbujesz wykończyć, jest używane zgodnie z unittest.mock dokumentacja.

Podstawową zasadą jest to, że poprawki, gdzie obiekt jest wzrok, która niekoniecznie jest taka sama, jak miejsce, w którym jest ona zdefiniowana.

Następny co trzeba by zrobić, to wrócić instancję MagicMock jak return_value z połatany obiektu. Podsumowując to, musisz użyć następującej sekwencji.

  • patch Object
  • przygotować MagicMock być stosowane
  • zwróci MagicMock my właśnie stworzony jako return_value

tu szybkie przykład projektu.

connection.py (klasa chcielibyśmy Mock)

class Connection(object):               
    def execute(self):               
     return "Connection to server made" 

file.py (Jeżeli stosowany jest klasa)

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  

testy/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

Wielkie dzięki! To był doskonały przykład i działa poprawnie! :) – AnaF