Соединение было принудительно закрыто удаленным хостом при получении - PullRequest
0 голосов
/ 13 июня 2018

Здравствуйте, я пытаюсь понять, почему я получаю это исключение:

Message: System.Net.Sockets.SocketException : An existing connection was forcibly closed by the remote host

Я выполняю модульные тесты с использованием NUnit и использую один и тот же экземпляр сервера redis для всех тестов (размещенных наlocal).

Первый набор модульных тестов работает как чудо - я могу отправлять и получать данные с сервера Redis.Во втором тесте я могу отправить, но при получении я получаю исключение. Должен ли я закрывать сокет между тестами (если он не находится вне тестовой области) или есть что-то, о чем я должен знать при переключении сюнит-тест другому?

Тест, который работает

class RedisTests
    {
        [TestCase("*2\r\n$3\r\nget\r\n$1\r\na\r\n","$1\r\n3\r\n")]
        [TestCase("*3\r\n$3\r\nset\r\n$1\r\na\r\n$1\r\n3\r\n", "+OK\r\n",Description ="Cmd:Set a 3 Result: +OK\r\n")]
        public async Task RedisSetTest(string command, string expectedResult)
        {
            Socket socket = TConstants.MakeSocket();
            IPEndPoint redisPoint = TConstants.MakeEndpoint(TConstants.DEFAULT_ADDRESS,TConstants.REDIS_PORT);
            await socket.ConnectAsync(redisPoint);
            Provider provider = Provider.Create(socket, 30);

            await socket.SendAsync(TConstants.UTF8Encode(command), SocketFlags.None);
            try
            {
                SmartMemory memory = await provider.ReceiveAsync();
                var payload = Extensions.Map(x => (char)x,
                                             memory.Iterator.Slice(0, memory.Message.Length).ToEnumerable()
                    );
                string result = string.Concat(payload);
                Assert.AreEqual(expectedResult, result);
            }
            catch (Exception exception)
            {
                Debug.WriteLine(exception.Message);
                throw;
            }


        }
    }

PS Метод Provider's ReceiveAsync - это просто оболочка ивыполняет ядро ​​Socket.ReceiveAsync таким же образом.

Тест, который выдает исключение

    class STMTests
        {

            [TestCase(2)]
            public async Task FillIntegerNode(int value)
            {

                Socket socket = TConstants.MakeSocket();
                IPEndPoint redisPoint=TConstants.MakeEndpoint(TConstants.DEFAULT_ADDRESS, TConstants.REDIS_PORT);
                //port = 6379
                //address="127.0.0.1"
                await socket.ConnectAsync(redisPoint);


                Memory<byte>data=BitConverter.GetBytes(injectableNode.Value);
                int sent=await socket.SendAsync(data, SocketFlags.None);


                Memory<byte> dt = new byte[33];
                var mem = await socket.ReceiveAsync(dt, SocketFlags.None);


                Assert.IsTrue(true);

            }
        }

Я добавил картинку с иерархией теста:

enter image description here

1 Ответ

0 голосов
/ 13 июня 2018

По общему правилу, если вы создаете что-то одноразовое, вы сами отвечаете за его утилизацию.В этом случае вы создаете сокет в каждом тесте, прямо в самом методе теста.Таким образом, вы должны использовать его в методе тестирования или в TearDown, который запускается сразу после каждого метода теста.

Как правило, самый простой способ избавиться от чего-либо, созданного в тесте, - черезusing.

OTOH, если вы хотите, чтобы все методы класса тестовых приборов использовали один и тот же сокет, вы должны открыть его в методе OneTimeSetUp и поместить в OneTimeTearDown.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...