问题与标题中一样,我如何通过示例模拟select.select来测试我的线程运行函数。 测试功能失败
ready = select.select([self.sock], [], [], 5)
TypeError: fileno() returned a non-integer
并打印类型
输入' builtin_function_or_method'
所以很清楚select.select在线程的范围内没有被模拟,而在测试中它是...(断言是实例)
import select
import threading
RECEIVE_BYTES = 256
class Bar(threading.Thread):
def __init__(self, sock):
threading.Thread.__init__(self)
self.sock = sock
def run(self):
print type(select.select)
ready = select.select([self.sock],[],[],5)
if ready[0]:
print self.sock.recv(RECEIVE_BYTES)
另一个模块中的测试如下
def test_run(self):
with patch("select.select"):
select.select.return_value = [True]
mock_sock = MagicMock()
foo = Bar(mock_sock)
assert isinstance(select.select, MagicMock)
foo.start()
测试通过鼻子进行
答案 0 :(得分:2)
简短的回答是在离开foo.join()
块之前调用with patch(...)
等待线程完成。错误是由线程完成之前删除补丁引起的。
顺便说一句,如果你发布一个可以运行的例子,人们会更容易帮助你。您的示例不完整,并且语法错误。
这是固定测试。我添加了循环,以便更容易重现错误。
import select
from mock import patch, MagicMock
from time import sleep
from scratch import Bar
IS_FIXED = True
def test_run():
for _ in range(20):
with patch("select.select"):
select.select.return_value = [True]
mock_sock = MagicMock()
foo = Bar(mock_sock)
assert isinstance(select.select, MagicMock)
foo.start()
if IS_FIXED:
foo.join()
sleep(0.1)
这是Bar
类,有一些语法修复。
import select
import threading
RECEIVE_BYTES = 256
class Bar(threading.Thread):
def __init__(self, sock):
threading.Thread.__init__(self)
self.sock = sock
def run(self):
print type(select.select)
ready = select.select([self.sock],[],[],5)
if ready[0]:
print self.sock.recv(RECEIVE_BYTES)