unittests为无限循环

时间:2016-06-20 08:49:03

标签: python unit-testing

我坚持使用此代码创建无限循环的unittest。

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

请告诉我们如何创建无限循环的单元测试?

2 个答案:

答案 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