У меня есть класс Python, который я использую для эмуляции сервера IMAP для модульного теста.Когда происходит обратный вызов handle()
, я пытаюсь использовать recv()
, чтобы получить только что полученные данные, но я блокирую вызов recv()
.Я думал, что recv()
вернется с данными, которые были получены, но вместо этого он просто сидит там.
В случае, если это имеет значение, я вижу, что сервер и основной поток отличаются в выводе журнала.
Я предполагаю, что это как-то связано с тем, что сокет был только что открыт, но через него данные не отправлялись.Нужно ли проверять, если это так, прежде чем пытаться позвонить recv()
?
Я создал сервер, используя:
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
...
# inside another class, we've got:
def startUp(self):
server = ThreadedTCPServer(('localhost', 5593), FakeImapServerHandler)
server.allow_reuse_address = True
server_thread = threading.Thread(target=server.serve_forever)
server_thread.setDaemon(True)
server_thread.start()
Затем внутри некоторого другого кода в нашем модулетестируем, пытаемся подключиться к поддельному серверу:
print("about to connect")
self.__imapCon = imaplib.IMAP4("localhost", 5593)
print("about to login") # we never get here
self.__imapCon.login(Config.config["imapUser"], Config.config["imapPassw"])
Сервер реализован так:
class FakeImapServerHandler(SocketServer.BaseRequestHandler):
def handle(self):
print("handling request")
incoming = self.request.recv(1024)
print("request was: " + incoming ) # never get here