2015-07-30 21 views
7

aufgerufen wurde Ich versuche unittest zu verwenden, um einige Funktionen eines SimpleXMLRPCServer zu testen, den ich gemacht habe. Zusammen mit Mock versuche ich jetzt zu behaupten, dass eine bestimmte Nachricht protokolliert wurde, wenn eine if-Anweisung erreicht wird, aber ich kann sie nicht zum Laufen bringen. Ich habe versucht, verschiedene Antworten zu implementieren, die ich hier auf StackOverflow oder Googlen gefunden habe, aber immer noch kein Glück. Die Anrufe ich im Testfall machen, sind wie folgt:Stellen Sie sicher, dass die Protokollierung mit einer bestimmten Zeichenfolge

def test_listen_for_tasks(self): 
    el = {'release': 'default', 'component': None} 
    for i in range(50): 
     self.server._queue.put(el) 
    ServerThread.listen_for_tasks(self.server, 'bla', 'blabla') 
    with mock.patch('queue_server.logging') as mock_logging: 
     mock_logging.warning.assert_called_with('There are currently {}' 
               ' items in the queue'.format(
               str(len(self.server._queue.queue)))) 

Die Funktion im Server ist wie folgt:

def listen_for_tasks(self, release, component): 
    item = {'release': release, 'component': component} 
    for el in list(self._queue.queue): 
     if self.is_request_duplicate(el, item): 
      logger.debug('Already have a request' 
         ' for this component: {}'.format(item)) 
      return 
    self._queue.put(item, False) 
    if len(self._queue.queue) > 50: 
     logger.warning('There are currently {}' 
         ' items in the queue'.format(
         str(len(self._queue.queue)))) 

Jede Idee, warum dies nicht funktioniert? Ich bin neu in Komponententests in Python und behaupte, dass ein Logger etwas getan hat, scheint das größte Problem zu sein, dem man gegenüberstehen könnte, also könnte ich etwas wirklich Einfaches im Code vermasselt haben. Jede Art von Hilfe wird sehr geschätzt werden!

EDIT: Für Vollständigkeit, hier ist der Testausgang und Versagen:

.No handlers could be found for logger "queue_server" 
F 


FAIL: test_listen_for_tasks (__main__.TestQueueServer) 

Traceback (most recent call last): 
    File "artifacts_generator/test_queue_server.py", line 46, in test_listen_for_tasks 
str(len(self.server._queue.queue)))) 
    File "/home/lugiorgi/Desktop/Code/publisher/env/local/lib/python2.7/site-packages/mock/mock.py", line 925, in assert_called_with 
raise AssertionError('Expected call: %s\nNot called' % (expected,)) 
AssertionError: Expected call: warning('There are currently 51 items in the queue') 
Not called 

Ran 2 tests in 0.137s 

FAILED (failures=1) 

Antwort

7

Sie müssen erste mock das Objekt, dann Aufruf der Funktion, die Sie testen möchten.

Wenn Sie sich über das Objekt lustig machen, müssen Sie auch das vollständige Paket und den Objekt-/Funktionsnamen des verspotteten Objekts angeben, keinen Variablennamen.

Schließlich ist es oft bequemer, die Dekorationsform patch zu verwenden.

So zum Beispiel:

logger = logging.getLogger(__name__) 

def my_fancy_function(): 
    logger.warning('test') 

@patch('logging.Logger.warning') 
def test_my_fancy_function(mock): 
    my_fancy_function() 
    mock.assert_called_with('test') 

# if you insist on using with: 
def test_my_fancy_function_with_with(): 
    with patch('logging.Logger.warning') as mock: 
     my_fancy_function() 
     mock.assert_called_with('test') 
+0

funktioniert wie ein Charme, vielen Dank nutzen! –

+0

Da dies für Python 2.7 getaggt ist, sollte eine vollständige Antwort den Backport unter https://github.com/testing-cabal/mock erwähnen, während das nicht Teil seiner eingebauten Module ist. –

2

Seit 3.4 Python können Sie unittest.TestCase Klassenmethode assertLogs

import logging 
import unittest 


class LoggingTestCase(unittest.TestCase): 
    def test_logging(self): 
     with self.assertLogs(level='INFO') as log: 
      logging.info('Log message') 
      self.assertEqual(len(log.output), 1) 
      self.assertEqual(len(log.records), 1) 
      self.assertIn('Log message', log.output[0]) 
+0

Danke, dies ist der beste Weg, Testfälle mit Loggern zu behandeln. – Abhijeet

Verwandte Themen