我坚持使用此代码创建无限循环的unittest。
try:
while True:
time.sleep(60)
except:
fun()
请告诉我们如何创建无限循环的单元测试?
答案 0 :(得分:7)
您正在测试什么行为?这里似乎没有任何副作用或返回值。没有什么可以测试的。如果只是在循环之后调用fun
那么听起来就像是过度规范。如果只是在循环结束后保留了一些不变量,那么你可以修补sleep
以抛出异常,然后在函数运行后检查状态。
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()
答案 1 :(得分:3)
您可以使用itertools.count
功能代替while True: ...
来编码无限循环。这可能会使代码效率稍低,但它可以mock无限循环:
import itertools
try:
for _ in itertools.count():
time.sleep(60)
except:
fun()
然后在你的测试中做:
from unittest.mock import patch
with patch("itertools.count") as mock_count:
# tests go here