2016-06-20 21 views
2

Ich bin bei diesem Code für die Erstellung von Unittest für Endlosschleife stecken geblieben.Unittests für Endlosschleife

try: 
    while True: 
    time.sleep(60) 
except: 
    fun() 

Bitte lassen Sie mich wissen, wie können wir Unittests für Endlosschleife erstellen?

+2

Sie könnten 'unittest.mock' out' time.sleep' verschiedene haben [ 'side_effect's] (https://docs.python.org /3/library/unittest.mock.html#unittest.mock.Mock.side_effect). – jonrsharpe

+0

aber es wird Stick gehen in die Endlosschleife als wahr True verwendet wird. Wie können wir dasselbe lösen? – sam

+3

Bitte * lesen * eigentlich die Dokumentation - der Nebeneffekt kann * "eine Ausnahme (Klasse oder Instanz) sein, die angehoben werden soll" *, so dass Sie die Schleife beenden können, wenn Sie wählen. – jonrsharpe

Antwort

3

Welches Verhalten testen Sie? Es scheint hier keine Nebenwirkungen oder Rückgabewerte zu geben. Es gibt nicht wirklich etwas zu testen. Wenn nur fun nach der Schleife aufgerufen wird, klingt das wie Überspezifikation. Wenn nur eine Invariante beibehalten wird, nachdem die Schleife beendet ist, können Sie sleep patchen, um eine Ausnahme auszulösen, und dann den Status untersuchen, nachdem die Funktion ausgeführt wurde.

from unittest import TestCase, main 
from unittest.mock import patch 

import module_under_test 

class TestLoop(TestCase): 
    # patch sleep to allow loop to exit 
    @patch("time.sleep", side_effect=InterruptedError) 
    def test_state_reset(self, mocked_sleep): 
     # given 
     obj = module_under_test.SomeClass() 

     # when 
     obj.infinite_loop() 

     # then assert that state is maintained 
     self.assertFalse(obj.running) 

if __name__ == "__main__": 
    main() 

module_under_test.py

import time 

class SomeClass: 
    def __init__(self): 
     self.running = False 

    def fun(self): 
     self.running = False 

    def infinite_loop(self): 
     self.running = True 
     try: 
      while True: 
       time.sleep(60) 
     except: 
      self.fun() 
3

Sie könnten die Endlosschleife mit der Funktion itertools.count anstelle von while True: ... codieren. Dies könnte der Code etwas weniger effizient, aber es macht es möglich, mock die unendliche Schleife:

import itertools 

try: 
    for _ in itertools.count(): 
     time.sleep(60) 
except: 
    fun() 

Dann in Ihrem Test tun:

from unittest.mock import patch 

with patch("itertools.count") as mock_count: 
    # tests go here