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()
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
aber es wird Stick gehen in die Endlosschleife als wahr True verwendet wird. Wie können wir dasselbe lösen? – sam
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