测试类似
的方法的最佳方法是什么?class Foo(object):
is_running = False
def run(self):
self.is_running = True
while self.is_running:
do_some_work()
这是消费者非常标准的代码,在设置is_running
标志时可以正常工作。
但这很难测试,因为它会进入循环并且永远不会出现,除非我创建第二个线程将is_running
更改为false。
是否有任何好的策略可以在不启动单独的线程来运行代码的情况下进行测试?
我还没有看到任何东西,但我想也许模拟库会提供每次[True, True, False]
读取时都能返回is_running
的功能,但这需要我改变{{1}从成员变量到属性或方法?
答案 0 :(得分:1)
正如我在评论中提到的,我认为使用线程测试此方法是一种非常可行的方法,可能是最好的解决方案。但是,如果您真的想避开线程,可以将is_running
转换为property
,然后使用mock.PropertyMock
模拟property
:
import mock
import time
class Foo(object):
def __init__(self):
self._is_running = False
@property
def is_running(self):
return self._is_running
@is_running.setter
def is_running(self, val):
self._is_running = val
def run(self):
self._is_running = True # Don't go through the property here.
while self.is_running:
print("in here")
time.sleep(.5)
with mock.patch('__main__.Foo.is_running', new_callable=mock.PropertyMock,
side_effect=[True, True, False]) as m:
f = Foo()
f.run()
输出:
in here
in here
<done>
我会说,为了实现特定的测试方法,改变你的生产实现这一点并不值得。只需让你的测试函数创建一个线程,在一段时间后设置is_running
。