Skip to content

Instantly share code, notes, and snippets.

@btctcn
Last active November 20, 2019 12:47
Show Gist options
  • Select an option

  • Save btctcn/feb713727b403fc510de3561d3e1a4ed to your computer and use it in GitHub Desktop.

Select an option

Save btctcn/feb713727b403fc510de3561d3e1a4ed to your computer and use it in GitHub Desktop.
import mock
import socket
import unittest
import sys
sys.path.append('/users/ab/python2019') # указать нужный путь
from homework_server_lecture10.task_2.class_User import User
from tcp_server2_threading import TcpServer, ClientThread
from threading import Timer
import time
class TestTcpServerWithMock(unittest.TestCase):
def test_tcp_server(self):
client1 = User('Masha', 'Serova', 14, 45, 150)
client1_name = client1.__repr__()
client1_name_encoded = client1_name.encode()
host = '127.0.0.1'
port = 5555
with mock.patch('socket.socket') as mock_object: # создаем мок сокета, чтобы
# иметь возможность подменить
# возвращаемое значение метода recv
# https://stackoverflow.com/questions/52394540/mocking-socket-recv
mocked_socket = mock_object.return_value #сохраняем в переменную ссылку на мок сокета
mocked_socket.recv.return_value = client1_name_encoded # определяем какое значение будет
# возвращаться методом recv
mocked_socket.accept.return_value = mocked_socket, '127.0.0.1:5555'
my_server = TcpServer(host=host, port=port, my_socket=mocked_socket) # создаем сервер и передаем ему моканый сокет
Timer(0.1, my_server.stop).start() # через 0.1 сек остановим сервер
my_server.run()
time.sleep(1) # после остановки сервера подождем 1 сек, чтобы дать всему выводу попасть на консоль
mocked_socket.setsockopt.assert_called_once_with(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # проверяем, что setsockopt был вызван ровно 1 раз и именно с такими параметрами
mocked_socket.bind.assert_called_once_with(host, port) # проверяем, что bind был вызван ровно 1 раз и именно с такими параметрами
mocked_socket.listen.assert_called_once_with(5) # проверяем, что listen был вызван ровно 1 раз и именно с такими параметрами
mocked_socket.accept.assert_called() # проверяем, что accept был вызван хотя бы 1 раз
mocked_socket.recv.assert_called_with(1024) # проверяем, что recv был вызван хотя бы 1 раз и именно с такими параметрами
mocked_socket.send.assert_called_with(client1_name_encoded) # проверяем, что send был вызван хотя бы 1 раз и именно с такими параметрами
mocked_socket.close.assert_called() # проверяем, что close был вызван хотя бы 1 раз
# class TestTcpServer(unittest.TestCase):
# def test_tcp_server(self):
# my_tcp = TcpServer(host='127.0.0.1', port=5555)
# # Подменяем ClientThread(conn, addr) mock-объектом
# with mock.patch('ClientThread(conn, addr)') as client_thread_mock:
# # Вместо TcpServer(host='127.0.0.1', port=5555)тоже используем mock-объект
# client_thread = mock.Mock()
# client_thread.name = 'MyTread'
# client_thread.run.return_value = 0
# cmd_mgr.set_service(service)
# self.assertTrue(service.start.called)
# cmd_mgr.run_command('status')
# # Используем assert-методы mock-объекта, которым мы подменили audit_service
# audit_service_mock.add_call.assert_called_once_with('MyService', 'run', 'status')
# service.run.assert_called_once_with('status')
# audit_service_mock.add_result.assert_called_once_with('MyService', 'run', 0)
if __name__ == '__main__':
unittest.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment